Python - 向列表项添加信息,从而创建元组列表

3

我有一个列表:

list1 = [1,2,3]

我正在通过某个任意函数查询每个列表中的项目信息,并希望添加结果以使列表变为:
list1 = [(1,a),(2,b),(3,x)]

如何在Python3中最好地实现这一点?
for item in list1:
    newinfo = some_arbitrary_function(item)
    item = (item, newinfo)

看起来无法工作。


3
a、b 和 x 来自哪里? - Jacobr365
3
我们不会因为认为提问者愚蠢或答案显而易见就对问题进行负评。我们会将问题降低评分,是因为问题描述不清或者难以确定如何回答。至少应该是这样的(我没有在这里进行负评)。 - Two-Bit Alchemist
a、b和x是任意函数(比如mysql查询或其他方程式)作用于1、2和3的结果,正如我所提供的伪代码示例所示。对于这种情况——这并不重要。 - Trees4theForest
但是根据评论,我已经更新了内容,以使我的问题更清晰明了。再次沟通证明比简单的负评更有用。 - Trees4theForest
有没有任何答案解决了这个问题? - Jacobr365
4个回答

5

你需要使用列表推导式:

lst = [1,2,3]
result = [(item, function(item)) for item in lst]

list 作为名称并不是一个好主意,这会遮盖掉原始的内置 list,使得后来在代码中无法访问。

如果您想保留对原始列表的引用:

lst[:] = [(item, function(item)) for item in lst]

这确实是最符合Python风格的方式,但会创建一个新列表。(原帖并未指定操作是否应该就地执行。) - code_onkel
了解列表名称--我在此处仅用于说明的目的(即:我最初打算使用列表,而不是元组)。 - Trees4theForest
@Trees4theForest 你的期望输出中有一个元组列表,就像我所做的一样。 - Moses Koledoye
这是一个不错的方法。它创建了[(1, a), (2, b)...],这正是您在@Trees4theForest中提出的要求。 - joel goldstick

3

无法使用迭代变量(您的情况下为item)分配列表项。实际上,与使用=进行赋值相比,变量item并没有什么特殊之处。如果操作旨在就地进行,则应执行以下操作:

for i, item in enumerate(list):
    list[i] = (item, func(item))

此外,您不应将列表命名为list,因为这会隐藏内置类型list

1

看起来你只是想改变列表中的值,使其从单个值变成一个元组,其中包含原始值和对该值进行查找后得到的结果。这应该可以满足你的需求。

zzz = [1,2,3]
i = 0
for num in zzz:
    zzz[i] = (num, somefunc(num))
    i += 1

运行此代码。
zzz = [1,2,3]
i = 0
for num in zzz:
    zzz[i] = (num, 8)
    i += 1        

给出结果 zzz = [(1,8), (2,8), (3,8)]


0
如果你有 list1 = [1,2,3]list2 = [x,y,z]zip(list1, list2) 将会给你你所需要的。你需要使用函数迭代第一个列表来找到 x, y, z 并将它们放入一个列表中。 zip(list1, list2)

[(1, x), (2, y), (3, z)]


但它是迭代的——不是一对一的列表合并。我想我可以从列表1构建列表2,然后压缩——但这似乎过于复杂。 - Trees4theForest
创建第二个列表作为一个推导式,该推导式调用函数:zip(list, [f(x) for x in list])。 - Kenny Ostrom
list2 = [function(item) for item in list1] zip(list1, list2) list2 = [function(item) for item in list1] zip(list1, list2) - Peter Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接