Как перебирать список списков в python?
У меня есть список таких списков.
documents = [['Human machine interface for lab abc computer applications','4'],
['A survey of user opinion of computer system response time','3'],
['The EPS user interface management system','2']]
Теперь мне нужно выполнить итерацию по приведенному выше списку и вывести список строк, как показано ниже (без номеров в исходном списке)
documents = ['Human machine interface for lab abc computer applications',
'A survey of user opinion of computer system response time',
'The EPS user interface management system']
Ответы
Ответ 1
Самое простое решение для выполнения именно того, что вы указали:
documents = [sub_list[0] for sub_list in documents]
Это в основном эквивалентно итеративной версии:
temp = []
for sub_list in documents:
temp.append(sub_list[0])
documents = temp
Это, однако, не совсем обычный способ итерации через многомерный список с произвольным числом измерений, поскольку вложенные списки/вложенные для циклов могут быть уродливыми; однако вы должны быть в безопасности, делая это для 2 или 3-х списков.
Если вы решите, что вам нужно сгладить более трех измерений, я бы рекомендовал реализовать функцию рекурсивного обхода, которая выравнивает все не- плоские слои.
Ответ 2
Если вы хотите просто перебрать цикл и сделать что-то с элементами (а не конкретные результаты, заданные в вопросе), вы можете использовать базовый цикл
for row in documents:
#do stuff with the row
print(row)
for column in row:
#do stuff with the columns for a particular row
print(column)
if(row[1] > 10):
print('The value is much too large!!')
Это языковая функция, известная как управление потоками".
Обратите внимание, что если вам нужен только результат, заданный в вопросе, лучше всего это сделать понимание списка, как это предусмотрено машинным стремлением.
documents = [doc[0] for doc in documents]
Обратите внимание, что он отбрасывает исходный список документов (вы переписываете исходную переменную), поэтому используйте следующую команду, если вы хотите иметь копию первого столбца, а также копию исходного списка:
document_first_row = [doc[0] for doc in documents]
Ответ 3
Как объяснено в http://docs.python.org/library/operator.html#operator.itemgetter, вы также можете попробовать
from operator import itemgetter
documents = map(itemgetter(0), documents)
который должен быть быстрее, чем использование явного цикла.
Ответ 4
** редактировать. спасибо DSM. Это неправильно, поскольку он просто выравнивает списки. Я не заметил дополнительных данных внутри списка после текста, который OP хочет игнорировать.
Хорошо, я сделаю это очень легко для вас!
itertools.chain.from_iterable(documents)
Как говорили другие, это зависит от того, какое окончательное поведение вам нужно. Поэтому, если вам нужно что-то более сложное, используйте рекурсивный обход или, если вы похожи на меня, используйте итеративный обход. Я могу помочь вам в этом, если вам это нужно.
Ответ 5
Вы также можете использовать zip с распаковкой аргументов, чтобы преобразовать список "строк" в список столбцов:
rows=[[1,'a','foo'],
[2,'b','bar'],
[3,'c','baz']]
columns=zip(*rows)
print columns
#[(1,2,3),
# ('a','b','c'),
# ('foo','bar','baz')]
print columns[0]
#(1,2,3)
оператор * передает все строки в виде отдельных аргументов в zip
zip(*rows) == zip(row1,row2,row3,...)
zip берет все строки и собирает столбцы с одним элементом из каждого списка
Ответ 6
вы можете использовать массив numpy
например
document = [['the quick brown fox', '2' ],['jumped over the lazy fox ','3']]
#
import numpy as np
document = np.array(document)
document=document[:,0]
Ответ 7
Вопрос мертв, но все еще зная, что еще один способ не болит:
documents = [['Human machine interface for lab abc computer applications','4'],
['A survey of user opinion of computer system response time','3'],
['The EPS user interface management system','2']]
document = []
for first,*remaining in documents:
document.append(first)
print(document)
['Human machine interface for lab abc computer applications',
'A survey of user opinion of computer system response time',
'The EPS user interface management system'
]