Как перебирать список списков в 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'
]