在列表中搜索元组元素

Search tuple elements within in list

我在 Python 中有一个列表

list_data = [('a','b',5),('aa','bb',50)]

和一些变量:

a = ('a','b','2')
c = ('aaa','bbb','500')

现在如何搜索 a 是否已经存在于 list_data 中?
如果是,将 2 添加到 a 的值,如果不是,则附加到 list_data?

结果应该是

list_data = [('a','b',7),('aa','bb',50),('aaa','bbb','500')]

实际上,这个问题是演示 Pythonic 做事方式的好方法。那么让我们看看我们能做些什么。

为了检查 python 列表中是否有内容,您可以使用运算符 in:

if a in list_data:
    do_stuff()

不过你问的有点不一样。如果我理解正确的话,您想通过多个键进行搜索。在这种情况下,您可以通过丢弃最后一个条目来 'trim' 您的元组。

Slicing 很方便:

value_trimmed = value[:-1]

现在您可以制作一个修剪后的元组列表:

list_trimmed = []

for a in list_data:
    list_trimmed.append(a[:-1])

然后在那里搜索:

if a[:-1] in list_trimmed:
    do_smth()

可以使用 list_comprehension:

以更简洁的方式构建此列表
list_trimmed = [item[:-1] for item in list_data]

要找到您的物品的确切位置,您可以使用 index() 列表方法:

list_trimmed.index(a[:-1])

这将 return 索引 a[:-1] 在 list_trimmed 中首次出现,如果找不到则抛出。我们可以避免显式检查 item 是否在列表中,只有在捕获到异常时才进行插入。

您的完整代码如下所示:

list_data = [('a','b',5), ('aa','bb',50)]
values_to_find = [('a','b','2'), ('aaa','bbb','500')]

list_trimmed = [item[:-1] for item in list_data]

for val in values_to_find:
    val_trimmed = val[:-1]
    try:
        ind = list_trimmed.index(val_trimmed)
        src_tuple = list_data[ind]   
        # we can't edit tuple inplace, since they are immutable in python
        list_data[ind] = (src_tuple[0], src_tuple[1], src_tuple[2]+2)
    except ValueError:
        list_data.append(val)

print list_data

当然,如果速度或内存效率是您主要关心的问题,那么此代码不是很合适,但您没有在问题中提及这些,这不是 python 在我的问题中真正关心的意见。

编辑:
您没有指定第二次检查 ('aaa','bbb','500') 时会发生什么 - 我们应该使用更新后的列表并递增匹配元组的最后一个元素,还是应该坚持使用原始列表并插入另一个副本?

如果我们使用更新列表,则不清楚如何处理递增字符串 '500' 2(我们可以将其转换为整数,但您应该首先适当地构造您的查询)。

或者您的意思是 如果找到 ,则将要搜索的元组的最后一个元素添加到列表中的元组中?请编辑您的问题以使其清楚。