Python 可以修改元组列表中的每个第一个元组元素吗?

Python 可以修改元组列表中的每个第一个元组元素吗?,python,list,tuples,Python,List,Tuples,我需要你的帮助,我有这样一个结构: myList = [(1,2,3),(2,4,4),(1,5,6)] 这是一个元组列表。现在我需要获取列表中每个元组的每个第一个元素,例如,用3替换每个1 输出应该是:myList=[3,2,3,2,4,4,3,5,6] 我知道我可以做到: for item in myList: if item[0] == 1: item[0] = 3 但是,还有其他方法可以做到这一点吗?没有重复整个列表 类似于:myList.getFirstItemO

我需要你的帮助,我有这样一个结构:

myList = [(1,2,3),(2,4,4),(1,5,6)]

这是一个元组列表。现在我需要获取列表中每个元组的每个第一个元素,例如,用3替换每个1

输出应该是:myList=[3,2,3,2,4,4,3,5,6]

我知道我可以做到:

for item in myList:
   if item[0] == 1:
      item[0] = 3
但是,还有其他方法可以做到这一点吗?没有重复整个列表

类似于:myList.getFirstItemOfEachTuple.replace1,3

编辑:如有必要,我可以将myList更改为[[1,2,3,4,5,6]…]

>>> myList = [(1,2,3,4,5,6),(4,5,6,7,8)]
>>> dic = {1:3}
>>> [ (dic.get(x[0],x[0]),) + x[1:] for x in myList]
[(3, 2, 3, 4, 5, 6), (4, 5, 6, 7, 8)]
如果myList是一个列表列表:

>>> myList = [[1,2,3,4,5,6],[4,5,6,7,8]]
>>> [ [dic.get(x[0],x[0]) ] + x[1:] for x in myList]
[[3, 2, 3, 4, 5, 6], [4, 5, 6, 7, 8]]
要修改原始列表,请执行以下操作:

>>> myList[:] = [(dic.get(x[0],x[0]),) + x[1:] for x in myList]
>>> myList
[(3, 2, 3, 4, 5, 6), (4, 5, 6, 7, 8)]

用列表理解

条件第一个元组项必须为1:

>>> L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> [[3] + x[1:] if x[0] == 1 else x for x in L]
[[3, 2, 3], [4, 5, 6], [7, 8, 9]]
元组而不是列表中的列表的解决方案:

>>> L = [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
>>> [(3,)  + x[1:] if x[0] == 1 else x  for x in L]
[(3, 2, 3), (4, 5, 6), (7, 8, 9)]

您不能更改tuple的值,它是不可变的。但您将元组转换为列表并更改值

但是,还有其他方法可以做到这一点吗?没有重复整个列表

不,不是在不重复整个列表的情况下

由于您希望检查每个元组以查看您希望更改的元素是否为某个数字,因此必须以某种方式迭代整个列表。因此,剩下的唯一考虑是如何做到这一点

有好的、经过时间检验的和行业标准的指导方针可以帮助您决定如何编写代码:在编写代码时,您应该首先考虑代码的可读性。代码效率是遥不可及的第二位。这条规则也有例外,但与此无关

看看你的原始代码。它假定项目是一个列表,因此我也将:

for item in myList:
    if item[0] == 1:
        item[0] = 3
现在与Ashwini的建议相比:

dic = {1: 3}
myList[:] = [[dic.get(x[0], x[0])] + x[1:] for x in myList]
现在问问你自己:

哪一个最容易阅读和理解?我认为答案是显而易见的。 哪一个更有效? 让我们看看效率:

您的原始代码:对于myList中的每个项目,执行单个列表查找,然后可能执行单个列表分配,这两种操作都非常快

Ashwinis代码:重建整个结构。对于myList中的每个项目,如果要更改不是第一个项目的项目,python需要创建三个新列表。Python必须为每个列表分配新内存,并垃圾收集大量旧列表,这两种操作都相当缓慢。这一切都是为了把它塞进一行

请使用您的原始代码。原因如下:

这是显而易见的方法。 这是蟒蛇式的方法。 这是最具可读性的方法。 这是最有效的方法。 这意味着这是正确的方法

如果您想要一个单行程序,请将其设置为函数:

def conditional_sublist_assign(myList, index, from, to):
    """
    For each `item` in `myList`, set `item[index] = to` if `item[index] == from`.
    """
    for item in myList:
        if item[index] == from:
            item[index] = to

# Here's your one-liner:
conditional_sublist_assign(myList, 0, 1, 3)
为了让我的论点更具说服力,以下是以下几行相关内容:

美胜于丑。 简单总比复杂好。 可读性很重要。 应该有一种——最好只有一种——显而易见的方法来做到这一点。 如果实现很难解释,那就不是个好主意。
在numpy中可以做到这一点,numpy的速度也是python的50倍,因此,如果速度很重要,那么这就是要走的路:

import numpy as np
myList = [(1,2,3),(2,4,4),(1,5,6)]
# convert list of tuples to 2D numpy array
myList = np.array(myList)
# get an array of all first element, syntax: myList[x, y] x and w and be ranges 1:3 og numbers like 1
# all the first elements are as follows:
first = myList[:,0]
# you can then make a true / false vector as follows
myList[first == 1,0] = 3
print myList
# prints:
#[[3 2 3]
# [2 4 4]
# [3 5 6]]

如果您对第一个元素感兴趣,我可以将结构更改为列表。如果项[0]==1,为什么会出现此行?请给出更好的示例。如果需要序列作为结果,请指定至少包含三项作为输入的序列和结果序列。添加了输出和其他输入!获取列表中每个元组的每个第一个元素,例如用3替换每个1。尽管与OP的代码相矛盾。如果原始列表是列表列表而不是元组列表,如何确定它?@gurehbgui使用它:[[dic.getx[0],x[0]]+x[1:]在myList中代表x]还有一件事:我想替换列表/元组中的第二个条目,而不是第一个条目吗?@gurehbgui这样应该可以:[x[:1]+[dic.getx[1],x[1]]+x[2:]对于myList中的x]很好的解决方案,+1。但是,请记住,numpy是一个非内置模块。而且,它的导入成本相当高,因此纯python解决方案有一个良好的开端。这意味着您需要做大量的数字运算才能赶上,可以说,并使使用numpy在运行时真正获得回报。@LauritzV.Thaulow,谢谢,在我的计算机上导入numpy需要0.15-0.2秒,但是不幸的是,从python列表/元组生成numpy数组比在整个列表中循环要昂贵。。。所以,如果他只需要一次pr列表:+1,我的技巧就毫无价值,因为如果实现很难解释,这是个坏主意。。。要是那是我的咒语就好了。。。不幸的是,我是一个线性类型:'