在列表中搜索元组元素
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(我们可以将其转换为整数,但您应该首先适当地构造您的查询)。
或者您的意思是 如果找到 ,则将要搜索的元组的最后一个元素添加到列表中的元组中?请编辑您的问题以使其清楚。
我在 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(我们可以将其转换为整数,但您应该首先适当地构造您的查询)。
或者您的意思是 如果找到 ,则将要搜索的元组的最后一个元素添加到列表中的元组中?请编辑您的问题以使其清楚。