2015-12-10 247 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'(我們可以將它轉換爲整數,但您應該已經在第一個位置適當地構造了您的查詢)。

或者也許你的意思是如果找到的話,在元組列表中添加元組搜索到元組的最後一個元素?請編輯您的問題以清楚說明。