2

我想同时遍历两个列表。

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

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

我想对第二个列表中每个列表中的每个 3 元组的每个元素执行一些功能(如果可以理解的话)。这个函数将依赖于第一个列表中的一个元素,我希望它全部按顺序运行。

即:如果我有一些列表,例如[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。然后我想使用一些函数遍历这两个列表。然后,我想构建一个新列表,它使用我的函数的输出,这将只是我扁平化的第二个列表的一些“调整后”值,但以它最初的格式,列表列表中的元组。

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

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

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

编辑#2:

勾选的解决方案准确地显示了这个问题需要什么!

编辑#3:

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

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

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

4

5 回答 5

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)]
于 2013-10-01T12:41:30.940 回答
1

您的第二个列表需要按两个级别展平:

import itertools
flatten = itertools.chain.from_iterable
for i, j in zip(list1, flatten(flatten(list2))):
    # whatever
于 2013-10-01T12:54:35.723 回答
0

python 的itertoolscontainsizip允许您使用与 zip 相同的语法压缩任意数量的列表。IEizip(l1, l2, l3)

于 2014-08-18T03:34:25.620 回答
0

您可以使用类似这样的方法从第二个列表中获取每个元素:

from itertools import chain
l=list(chain.from_iterable(list2))
于 2013-10-01T12:49:26.190 回答
0

做这个。

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

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

于 2015-08-17T16:23:03.273 回答