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

2024-10-01 15:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

我知道我可以做到:

^{pr2}$

但有没有其他方法可以做到这一点呢?不遍历整个列表?在

比如:myList.getFirstItemOfEachTuple.replace(1,3)

编辑:如果需要,我可以将myList更改为[[1,2,3,4,5,6]...]。在


Tags: 方法元素编辑列表结构replace元组mylist
3条回答

But is there a other way to do this? without iterating over the whole list?

不。不需要遍历整个列表。在

由于您希望检查每个元组,以查看您希望更改的元素是否是某个数字,因此必须以某种方式遍历整个列表。所以剩下的唯一考虑就是如何去做。在

有很好的、经过时间检验和行业标准的指导方针可以帮助您决定如何编写代码:在编写代码时,您应该优先考虑代码的可读性。代码效率是一个遥远的秒。这条规则也有例外,但它们在这里并不相关。在

看看你的原始代码。它假设itemlist,因此我也将:

for item in myList:
    if item[0] == 1:
        item[0] = 3

现在对比一下阿什维尼的建议:

^{pr2}$

现在问问你自己:

  • 哪一个最容易阅读和理解?我认为答案是显而易见的。在
  • 哪个更有效?在

让我们看看效率:

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

  • Ashwinis代码:重建整个结构。对于myList中的每个项目,python需要创建3个新列表(如果您想更改不是第一个的项目,则需要创建5个)。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)

为了使我的论点更有说服力,以下是The Zen of Python中的一些相关行:

  • 美总比丑好。在
  • 简单总比复杂好。在
  • 可读性很重要。在
  • 应该有一种——最好只有一种——显而易见的方法。在
  • 如果实现很难解释,这是个坏主意。在
>>> 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是列表列表:

^{pr2}$

要修改原始列表:

>>> 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]]

针对元组而不是列表中的列表的解决方案:

^{pr2}$

相关问题 更多 >

    热门问题