Перебор списка по списку в Python

Я хочу перебрать список.
Я хочу перебирать нерегулярно вложенные списки внутри списка.
Кто-нибудь может дать мне знать, как я могу это сделать?

x = [u'sam', [['Test', [['one', [], []]], [(u'file.txt', ['id', 1, 0])]], ['Test2', [], [(u'file2.txt', ['id', 1, 2])]]], []]

Ответ 1

Эта функция генератора traverse может использоваться для итерации по всем значениям:

def traverse(o, tree_types=(list, tuple)):
    if isinstance(o, tree_types):
        for value in o:
            for subvalue in traverse(value, tree_types):
                yield subvalue
    else:
        yield o

data = [(1,1,(1,1,(1,"1"))),(1,1,1),(1,),1,(1,(1,("1",)))]
print list(traverse(data))
# prints [1, 1, 1, 1, 1, '1', 1, 1, 1, 1, 1, 1, 1, '1']

for value in traverse(data):
    print repr(value)
# prints
# 1
# 1
# 1
# 1
# 1
# '1'
# 1
# 1
# 1
# 1
# 1
# 1
# 1
# '1'

Ответ 2

Итак, подождите, это просто список в списке?

Самый простой способ - это просто использовать вложенные для циклов:

>>> a = [[1, 3, 4], [2, 4, 4], [3, 4, 5]]
>>> a
[[1, 3, 4], [2, 4, 4], [3, 4, 5]]
>>> for list in a:
...     for number in list:
...         print number
...
1
3
4
2
4
4
3
4
5

Или это нечто более сложное? Произвольное гнездование или что-то еще? Сообщите нам, если есть что-то еще.

Кроме того, по соображениям производительности вы можете посмотреть, как использовать списки для этого:

http://docs.python.org/tutorial/datastructures.html#nested-list-comprehensions

Ответ 3

Этого также можно добиться с помощью itertools.chain.from_iterable, который сгладит последовательные итерации:

import itertools
for item in itertools.chain.from_iterable(iterables):
    # do something with item    

Ответ 4

если вы не хотите рекурсии, вы можете попробовать:

x = [u'sam', [['Test', [['one', [], []]], [(u'file.txt', ['id', 1, 0])]], ['Test2', [], [(u'file2.txt', ['id', 1, 2])]]], []]
layer1=x
layer2=[]
while True:
    for i in layer1:
        if isinstance(i,list):
            for j in i:
                layer2.append(j)
        else:
            print i
    layer1[:]=layer2
    layer2=[]
    if len(layer1)==0:
        break

который дает:

sam
Test
Test2
(u'file.txt', ['id', 1, 0])
(u'file2.txt', ['id', 1, 2])
one

(обратите внимание, что он не просматривал кортежи для списков, потому что кортежи не являются списками. Вы можете добавить кортеж к методу "isinstance", если вы хотите исправить это)

Ответ 5

Похоже, вам нужно использовать рекурсию. Сделайте функцию для итерации по списку, и если она попадает в элемент, который также является списком, вызовите себя для повторения в члене. Здесь ссылка на нечто похожее:

http://www.saltycrane.com/blog/2008/08/python-recursion-example-navigate-tree-data/

Ответ 6

Если вам интересно получить все значения в одном списке, вы можете использовать следующий код:

text = [u'sam', [['Test', [['one', [], []]], [(u'file.txt', ['id', 1, 0])]], ['Test2', [], [(u'file2.txt', ['id', 1, 2])]]], []]

def get_values(lVals):
    res = []
    for val in lVals:
        if type(val) not in [list, set, tuple]:
            res.append(val)
        else:
            res.extend(get_values(val))
    return res

get_values(text)

Ответ 7

x = [u'sam', [['Test', [['one', [], []]], [(u'file.txt', ['id', 1, 0])]], ['Test2', [], [(u'file2.txt', ['id', 1, 2])]]], []]
output = []

def lister(l):
    for item in l:
        if type(item) in [list, tuple, set]:
            lister(item)
        else:
            output.append(item)

lister(x)

Ответ 8

Создайте метод для рекурсивной итерации по вложенным спискам. Если текущий элемент является экземпляром списка, снова вызовите тот же метод. Если нет, выведите текущий элемент. Вот пример:

data = [1,2,3,[4,[5,6,7,[8,9]]]]

def print_list(the_list):

    for each_item in the_list:
        if isinstance(each_item, list):
            print_list(each_item)
        else:
            print(each_item)

print_list(data)

Ответ 9

два вложенных цикла для цикла?

 for a in x:
     print "--------------"
     for b in a:
             print b

Это поможет, если вы приведете пример того, что вы хотите делать со списками