在Python中同时迭代多个列表

时间:2013-10-01 12:37:00

标签: python list loops

我想同时迭代两个列表。

第一个列表只是一个常规的元素列表。

第二个列表是一个包含多个列表的列表,每个列表包含实际上是3元组的元素。

我想对第二个列表中每个列表中每个3元组的每个元素执行一些函数(如果这是可以理解的)。此函数将取决于第一个列表中的元素,我希望它按顺序运行。

ie:如果我有一些列表,例如[0,1,2,3,1,5,6,7,1,2,3,5,1,1,2,3,5,6]作为我的第一个列表,[[(13,12,32),(11,444,25)],[(312,443,12),(123,4,123)],[(545,541,1),(561,112,560)]]作为我的第二个列表,我想执行这样的操作,使其涉及第一个元素第一个列表和第二个列表的第一个列表的第一个元组的第一个元素。我希望使用第一个列表的第n个元素和元组bla bla的第n个元素迭代此操作

因此,如果我们正在查看将一起使用哪些元素进行操作:

  • 0与13
  • 相符
  • 1与12
  • 相关
  • 2与32
  • 相符
  • 3与11
  • 相符
  • 1与444
  • 相符
  • 5与25
  • 相符
  • 6与312
  • 相关

等等。

发生的事情是我的函数将从第二个列表中获取元素,它从列表1中的配对元素,以某种方式使用这些位,并输出一个新值来替换其原始的第二个列表对应项。然后我想构建一个替换/新的“第二个列表”,这是运行此函数后的第二个列表(使用上述信息)

希望这是半凝聚力的,我尽量提供信息。如有任何疑问,请咨询。

干杯,谢谢你们提供的任何帮助!

修改

我想取列表1和列表2,然后展平列表2。 然后我想使用一些函数迭代两个列表。 然后我想构建一个新的列表,它使用我的函数的输出,这将是我的扁平第二个列表的一些“调整”值,但是以它的原始格式,在列表列表中的元组。 / p>

ie:我的输出可能是这样的:

[[(13,13,32),(11,444,24)],[(313,443,12),(123,4,123)],[(546,542,1),(561,112,561)]]

由于“通过”我的函数,某些值会改变一点或保持不变。

修改#2:

勾选的解决方案显示了此问题所需的确切内容!

修改#3:

顶级解决方案需要一些修复:
如何修复代码,如果第一个列表为空,输出将只是原始的第二个列表? 如果第二个列表为空,则输出应该只是一个空列表。 如果len(列表1)> len(列表2),它将迭代直到列表2的结尾,然后忽略列表1中的多余,输出与原始列表2相同格式的新列表。 如果len(列表2)> len(列表1),它只会迭代列表1可以匹配的位置,但保留列表2的其余部分,而不是将其删除。

我可以使用if / elseif / else循环执行所有这些修复吗?

编辑:我仍然希望解决这些问题,这些问题可以分开/假设为单独的查询。如果有人有兴趣帮忙,我在https://stackoverflow.com/questions/19118641/making-a-function-only-run-for-certain-conditions-in-python提出了一个新问题。

5 个答案:

答案 0 :(得分:4)

您可以像这样使用zipitertools.chain

from itertools import chain

first = [0, 1, 2, 3, 1, 5, 6, 7, 1, 2, 3, 5, 1, 1, 2, 3, 5, 6]
second = [
    [(13, 12, 32), (11, 444, 25)],
    [(312, 443, 12), (123, 4, 123)],
    [(545, 541, 1), (561, 112, 560)]
]    
zip(first, chain(*(chain(*second))))

<强>更新

def add(x, y):
    return x + y

# Flatten the second list
second_flattened = list(chain(*(chain(*second))))

# There is probably a better way to achieve this
foo = [add(x, y) for x, y in zip(first, second_flattened)]

# If second is longer we should append unprocessed values
if len(second_flattened) > len(first):
    foo += second_flattened[len(foo): ]

bar = [foo[i:i+3] for i in range(0, len(foo), 3)]
second = [bar[i:i+2]  for i in range(0, len(foo) / 3, 2)]

答案 1 :(得分:1)

您的第二个列表需要分为两个级别:

import itertools
flatten = itertools.chain.from_iterable
for i, j in zip(list1, flatten(flatten(list2))):
    # whatever

答案 2 :(得分:0)

你可以使用这样的东西从第二个列表中获取每个元素:

from itertools import chain
l=list(chain.from_iterable(list2))

答案 3 :(得分:0)

python的itertools包含izip,它允许您使用与zip相同的语法压缩任意数量的列表。即izip(l1, l2, l3)

答案 4 :(得分:0)

这样做。

dict(zip(ListA, eval('[' + repr(ListB).replace('(', '').replace(')', \
'').replace('[', '').replace('[', '') + ']'))

我知道它很长,但它会返回一个包含你需要的输出的字典。