Перебор списка по списку в 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
Это поможет, если вы приведете пример того, что вы хотите делать со списками