其实,这个问题是一个很好的方式,以几个展示Python的做事的方法。所以让我们看看我们能做些什么。
为了检查,如果事情是在Python列表你可以使用运营商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:
012以较不详细的方式构建
list_trimmed = [item[:-1] for item in list_data]
要查找您的项目恰恰是你可以用列表的方法index()
:
list_trimmed.index(a[:-1])
这将返回a[:-1]
第一次出现的索引list_trimmed或抛出,如果它不能被发现。我们可以避免显式检查项目是否在列表中,并且只有在捕获到异常时才进行插入。
你完整的代码看起来就像这样:
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'
(我们可以将它转换为整数,但您应该已经在第一个位置适当地构造了您的查询)。
或者也许你的意思是如果找到的话,在元组列表中添加元组搜索到元组的最后一个元素?请编辑您的问题以清楚说明。
你想在列表的每个元组中只检查'a'或'a','b'吗? – dnit13