的元組存在元素我有元組看起來像列表:檢查的元組
CODES = (
('apple', 'reddelicious'),
('caramel', 'sweetsticky'),
('banana', 'yellowfruit'),
)
什麼檢查,如果在元組存在一個價值的最佳方式是什麼?例如,我希望能夠說:
'apple' in CODES
,並獲得真正的
的元組存在元素我有元組看起來像列表:檢查的元組
CODES = (
('apple', 'reddelicious'),
('caramel', 'sweetsticky'),
('banana', 'yellowfruit'),
)
什麼檢查,如果在元組存在一個價值的最佳方式是什麼?例如,我希望能夠說:
'apple' in CODES
,並獲得真正的
您正在尋找any()
:
if any('apple' in code for code in CODES):
...
用一個簡單的generator expression相結合,這樣做的任務。生成器表達式採用每個元組,並且如果它包含'apple'
,則產生True
。 any()
然後在它請求的第一個項目返回True
(否則爲False
)時返回True
。因此,這就是你想要的。它也很好地讀取 - 如果任何元組包含'apple'
。
如果你這個做次大規模的數量和需要的性能,那麼它可能是值得的一組中的所有值的讓你做到這一點非常快:自然
cache = set(itertools.chain.from_iterable(CODES)))
,構建這將會很慢並且會使用內存,所以這不是一個好主意,除非你需要很多性能並且會進行很多會員檢查。
您可以使用itertools.chain()
:
使用它與in
會導致短路,類似於any()
。
In [30]: CODES = (
....: ('apple', 'reddelicious'),
....: ('caramel', 'sweetsticky'),
....: ('banana', 'yellowfruit'),
....:)
In [31]: from itertools import chain
In [32]: 'apple' in chain(*CODES)
Out[32]: True
In [33]: 'foo' in chain(*CODES)
Out[33]: False
對於性能比較你可以檢查我的other answer。
+1,這是一個合理的方式來做到這一點 - 我不知道它如何比較性能。儘管你應該在'chain(*)'上使用'chain.from_iterable()'。 – 2013-02-27 23:51:35
@Lattyware我認爲'any()'和我的方法都在做短路,所以對於大數據來說性能差異應該可以忽略不計。 – 2013-02-28 00:07:25
如果不是僅僅檢查是否存在,我想獲得第二個值?在這種情況下「reddelicious」? – 2013-02-28 00:02:18
在這種情況下,你正在使用錯誤的數據結構,使用'dict',然後只做'CODES [「apple」]'(如果它不在那裏,就趕上'KeyError')。 – 2013-02-28 00:04:48
@ 9位只使用'dic = dict(CODES)',這將返回一個字典。然後'dic ['apple']'會導致''reddelicious''。 – 2013-02-28 00:10:19