其實,這個問題是一個很好的方式,以幾個展示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