gpt4 book ai didi

python - python 列表的子集基于同一列表的元素组,pythonically

转载 作者:行者123 更新时间:2023-11-28 20:00:25 42 4
gpt4 key购买 nike

我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如:

[7,56,1, 8,0,0, 2,0,0, 6,1,1, 7,2,0, 2,99,1]

我想(以 Python 方式)处理此列表以根据“标志”的值创建一个新的数字列表:如果“标志”为 1,则我需要“数字”,否则为 0。所以上面的列表会变成:

[7, 0, 0, 6, 0, 2]

我最初的尝试是:

list = [7,56,1, 8,0,0, 2,0,0, 6,1,1, 7,2,0, 2,99,1]
numbers = list[::3]
flags = list[2::3]

result = []
for i,number in enumerate(numbers):
result.append(number if flags[i] == 1 else 0)

这行得通,但在我看来应该有更好的方法从列表中干净地提取元组。像这样的东西:

list = [7,56,1, 8,0,0, 2,0,0, 6,1,1, 7,2,0, 2,99,1]
for (number, __, flag) in list:
...etc

但是我好像做不到。

我可以循环遍历整个列表:

result = []
for i in range(0, len(list), 3):
result.append(list[i] if list[i+2] == 1 else 0)

这看起来更小也更高效。

我不清楚这里的最佳选择。任何建议将不胜感激。

注意:我已经接受了wim的回答:

[L[i]*L[i+2] for i in range(0, len(L), 3)]

但要重申 wims 和 ShadowRangers 响应都有效。我接受了基于简单明了的 wim 的回答(并且,在较小程度上,与 python 2 的兼容性,尽管 ShadowRanger 指出 zip 也在 Py2 中,所以这个基础是无效的)。

ShadowRanger 的回答:

[number if flag else 0 for number, _, flag in zip(*[iter(mylist)]*3)]

也完全符合我的想法(提供元组),但有点晦涩难懂并且需要 zip。正如 wim 指出的那样,ShadowRanger 的答案非常适合数据流而不是固定列表。

我还要指出,ShadowRanger 的回答增加了对 zip() 的模糊使用(随着时间的推移会变得不那么模糊),但是通过使用元组的命名值增加了清晰度,所以这有点赢/输。

对于那些努力理解 zip(*[iter(mylist)]*3)] 的人来说,它创建了一个迭代器的三个副本,然后用于构造元组。因为它是同一个迭代器,所以每次使用都会推进迭代器,使元组完全符合我的要求。

为了清楚和通用,我也有点倾向于@ShadowRanger 的解决方案的修改版本:

i = iter(mylist)
[number if flag else 0 for number, _, flag in zip(i, i, i)]

(对我来说,这似乎不那么晦涩)。

最佳答案

我认为最直接的方法是简单的列表理解:

>>> [L[i]*L[i+2] for i in range(0, len(L), 3)]
[7, 0, 0, 6, 0, 2]

或者考虑 numpy,它对于这样的任务非常强大:

>>> import numpy as np
>>> a = np.array(L).reshape(-1, 3).T
>>> a
array([[ 7, 8, 2, 6, 7, 2],
[56, 0, 0, 1, 2, 99],
[ 1, 0, 0, 1, 0, 1]])
>>> a[0]*a[2]
array([7, 0, 0, 6, 0, 2])

关于python - python 列表的子集基于同一列表的元素组,pythonically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58091360/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com