Python:更新元组列表

6
我有一个元组列表如下: list = [(1, 'q'), (2, 'w'), (3, 'e'), (4, 'r')]
我正在尝试创建一个更新函数update(item,num),该函数查找列表中的项目,然后更改数字。
例如,如果我使用update(w,6),结果将是:
list =   [(1, 'q'), (6, 'w'), (3, 'e'), (4, 'r')]

我尝试了这段代码,但是出现了错误。

if item in heap:
        heap.remove(item)
        Pushheap(item,num)
    else:
        Pushheap(item,num)

Pushheap是将元组推入堆的函数,有什么想法吗?


3
无法在元组中分配值,因此您必须完全替换该元组。 - njzk2
7
不是很清楚您想让这个函数做什么。提供一个示例以及您尝试过的事情会很有帮助。 - Horia Coman
2
你不能这样做。元组是不可变的。但是,你可以从列表中删除元组,并替换它们以解决这个问题。但我想问一下,如果你需要改变它们的值,为什么要使用元组? - Christian Dean
3
顺便提一句,你不应该使用“list”作为变量名,因为它会覆盖内置的“list”类型,这可能会导致出现神秘的错误。 - PM 2Ring
1
你目前尝试了什么?你应该发布一个你已经尝试过或者已经有的解决方案,如果你想要一个关于是否可以更好地完成的意见。 - Nandeep Mali
显示剩余6条评论
3个回答

5

您可以简单地浏览列表,寻找具有所需字母的元组,并替换整个元组(您无法修改元组),当您找到所需项目时,跳出循环。例如

lst = [(1, 'q'), (2, 'w'), (3, 'e'), (4, 'r')]

def update(item, num):
    for i, t in enumerate(lst):
        if t[1] == item:
            lst[i] = num, item
            break

update('w', 6)
print(lst)

输出

[(1, 'q'), (6, 'w'), (3, 'e'), (4, 'r')]

然而,你应该认真考虑使用字典来代替元组列表。搜索字典比在列表中进行线性扫描要高效得多。


@PM_2Ring 通过使用 enumerate 捕获索引的方式是非常启发性的。+1 - R__raki__
3
enumerate 是一个非常实用的函数。它不仅能让代码更加简洁清晰,而且比循环遍历索引和对列表(或其他有序集合)进行索引要快。顺便说一下,如果你想从某个数字开始计数,它还可以接受一个额外的 start 参数。 - PM 2Ring

3
正如评论中所指出的,您正在使用一个不可变的数据结构来更改数据项。没有进一步的上下文,看起来您想要一个字典,而不是元组列表,并且还想让元组中的第二个项目(字母)成为键,因为您计划修改数字。
基于这些假设,我建议将元组列表转换为字典,然后使用普通的字典赋值。这也假设顺序不重要(如果重要,可以使用OrderedDict),并且相同的字母不会出现两次(如果出现两次,则字典中只有最后一个数字)。
>>> lst =  [(1, 'q'), (2, 'w'), (3, 'e'), (4, 'r')]
>>> item_dict = dict(i[::-1] for i in lst)
>>> item_dict
{'q': 1, 'r': 4, 'e': 3, 'w': 2}
>>> item_dict['w'] = 6
>>> item_dict
{'q': 1, 'r': 4, 'e': 3, 'w': 6}

1

元组是不可变对象。这意味着一旦创建,就无法更改其内容。

然而,您可以通过替换要更改的元组来解决此问题。可能会有类似于以下的方法:

def change_item_in_list(lst, item, num):
    for pos, tup in enumerate(lst):
        if tup[1] == item:
            lst[pos] = (num, item)
            return

l = [(1, 'q'), (2, 'w'), (3, 'e'), (4, 'r')]
print(l)
change_item_in_list(l, 'w', 6)
print(l)

但正如 @brianpck 已经说过的那样,您可能想要一个有序字典(ordered-dictionary)而不是元组列表。


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