![](/img/trans.png)
[英]search tuple with a list and return new tuple with only elements of the list
[英]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
?
如果是,则在a
的值上加上2,否则不附加到list_data
?
结果应为
list_data = [('a','b',7),('aa','bb',50),('aaa','bbb','500')]
实际上,这个问题是一个很好的方式来演示Python的做事方式。 因此,让我们看看我们能做什么。
为了检查,如果事情是你可以使用运营商蟒蛇名单in
:
if a in list_data:
do_stuff()
但是您的要求有所不同。 如果我理解正确的话,您想进行多个键的搜索。 在这种情况下,您可以通过丢弃最后一个条目来“修剪”您的元组。
切片很方便:
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]
要找到项目的确切位置,可以使用list的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(我们可以将其转换为整数,但是首先应该适当地构造查询)。
还是您的意思是将找到的元组的最后一个元素添加到列表中的元组(如果找到) ? 请修改您的问题以使其清楚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.