我在Python中有一个列表
list_data = [('a','b',5),('aa','bb',50)]
和一些变量:
a = ('a','b','2')
c = ('aaa','bbb','500')
现在如何在a
中搜索list_data
是否已存在?
如果是,则将a
的值加2,如果不附加到list_data
?
结果应为
list_data = [('a','b',7),('aa','bb',50),('aaa','bbb','500')]
答案 0 :(得分:1)
实际上,这个问题是几个演示 Pythonic 做事方式的好方法。所以,让我们看看我们能做些什么。
为了检查某些内容是否在python列表中,您只需使用operator in
:
if a in list_data:
do_stuff()
但你问的是有点不同。如果我理解正确的话,你想做一些像多个键搜索的事情。在这种情况下,您可以修剪'丢弃最后一个条目你的元组。
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])
这将返回list_trimmed中首次出现的a[:-1]
索引,如果找不到则抛出。我们可以避免显式检查项是否在列表中,并且仅在捕获到异常时才进行插入。
您的完整代码如下所示:
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(我们可以将其转换为整数,但您应该首先适当地构造您的查询)。
或许你的意思是将被搜索的元组的最后一个元素添加到列表中的元组(如果找到了)?请编辑您的问题以明确说明。