2014-12-01 48 views
0

我想知道如何有效地检查一个值是否在给定的元组列表中。说我有一个列表:检查单词是否在元组列表中

("the", 1) 
("check", 1) 
("brown, 2) 
("gary", 5) 

我怎么能检查一个给定的单词是否是列表中,忽略元组的第二个值?如果它只是一个字,我可以使用

if "the" in wordlist: 
    #... 

,但是这是不行的,有沿线这个我可以做什么?

if ("the", _) in wordlist: 
    #... 
+0

什么是更高效的将取决于你是否必须只做一次或多次使用同一个worldlist – wim 2014-12-01 23:19:35

回答

6

可能使用散列

>>> word in dict(list_of_tuples) 
+0

非常实用的解决方案。完善。 – simopopov 2014-12-01 23:20:17

+0

这是一个很好的建议,甚至比我的zip更容易:P – 2014-12-01 23:20:20

+0

如果我也需要访问该位置,是否有类似这样的简单解决方案? – 2014-12-01 23:24:05

1
for tupl in wordlist: 
    if 'the' in tupl: 
     # ... 
2

使用any

if any(word[0] == 'the' for word in wordlist): 
    # do something 
0
words,scores = zip(*wordlist) 

拆分单词表到单词的列表,然后评分列表只是

print "the" in words 
+0

简短回复是完全可以接受的,但是将代码块中的叙述从代码块中分离出来并通过解释方式提供一两句话可以创造出高质量的回复。 – Jeeped 2014-12-02 00:09:43

1

查找列表中的单词将是O(n)时间复杂度,因此列表中的单词越多,查找速度越慢。为了加快速度,您可以按字母排序列表,然后使用二进制搜索 - 单词搜索变为log(N)复杂度,但最有效的方法是使用集合结构的散列:

'the' in set((word for word, _ in a)) 

O(1),与集合中有多少单词无关。顺便说一句,它保证了这个单词只有一个实例在结构中,而列表可以保存许多你所追加的“the”。 Set应该被构造一次,用.add方法添加单词(添加新单词也是O(1)的复杂性)

+0

但是排序是N * log(N) – wim 2014-12-01 23:46:06

+0

@wim,当然! topicstarter询问了查询,我回答了查找时间。如果没有关于数据使用的更多知识,通常在效率的情况下进行交谈是不可能的,例如,多长时间一次单词添加到查询中的频率。 – 2014-12-01 23:52:47