2015-12-10 250 views
0

我有在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')] 
+0

你想在列表的每个元组中只检查'a'或'a','b'吗? – dnit13

回答

1

其实,这个问题是一个很好的方式,以几个展示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'(我们可以将它转换为整数,但您应该已经在第一个位置适当地构造了您的查询)。

或者也许你的意思是如果找到的话,在元组列表中添加元组搜索到元组的最后一个元素?请编辑您的问题以清楚说明。