2017-04-21 30 views
1

我写了一个简单的脚本,它的范围是:如何获取其值至少包含一个项目在另一个列表中的字典键?

list=[1,19,46,28 etc...] 
dictionary={Joey:(10,2,6,19), Emily: (0,3), etc} 

现在我需要找到具有在值

例如至少列表中的一个条目的字典中的所有键: 19是乔斯的价值观,所以乔伊是赢家。

我怎么做的:(无程序员的话)

# NodesOfSet = the list 

# elementsAndTheirNodes = the dictionary 

# loop as many times as the number of key:value entries in the dictionary element:nodes 
# simply: loop over all the elements 
for i in range (0, len (elementsAndTheirNodes.keys())): 

    # there is an indent here (otherwise it wouldnt work anyway) 
    # loop over the tuple that serves as the value for each key for a given i-th key:value 
    # simply: loop over all their nodes 
    for j in range (0, len (elementsAndTheirNodes.values()[i])): 

     # test: this prints out element + 1 node and so on 
     # print (elementsAndTheirNodes.keys()[i], elementsAndTheirNodes.values()[i][j] ) 

     for k in range (0, len (NodesOfSet)): 
      if NodesOfSet[k] == (elementsAndTheirNodes.values()[i][j]): 
       print (elementsAndTheirNodes.keys()[i], " is the victim") 
      else: 
       print (elementsAndTheirNodes.keys()[i], " is not the victim") 

但是,这是非常耗时的,因为它遍历数据库基本上一切。我可以要求帮助优化吗?谢谢!

+3

只是一个提示:这是不是很符合Python - >列表是一个受保护的词,因此不要将其用作变量名,变量始终以小写字母开头,“词”通常由“_”分隔。也不要在功能和“()”之间放置空格,如打印或len或范围 – ted

+1

您好!谢谢你的评论。我不知道在任何地方使用列表的单词。首都的事情很有趣,虽然不是很有帮助。空格在那里是因为我的文本编辑器在打字时提供了我已经使用过的单词。 – Jewenile

+0

有人编辑我的问题让它更容易理解,真是太好了。但是真的有必要删除我不是程序员,我的谢意? – Jewenile

回答

5

我会使用列表理解和内置any一旦找到共享项目就会短路。打开你的名单分成一组降低了会员查找从O(n)O(1)复杂:

s = set(lst) 
result = [k for k, v in dct.items() if any(i in s for i in v)] 

小心不分配内建的名称为您的对象(例如list),以避免使内置不可后来在你的代码。

2

请勿使用名称listlist是库函数的名称。

l = [1, 19, 46, 28, ...] 
l_set = set(l) 

d = {'Joey':(10,2,6,19), 'Emily': (0,3), ...} 

winners = [k for k, v in d.items() if any(i in l_set for i in v)] 

any将停止通过v尽快迭代,因为它“看到”共享价值,节省一些时间。

1

您还可以使用交集来检查是否有任何字典中值的元组的元素有什么共同点与你的“名单”条目:

l = [1,19,46,28, ...] 
s = set(l) 
d = {Joey:(10,2,6,19), Emily: (0,3), ...} 
winners = [k for k, v in d.iteritems() if s.intersection(v)] 
+0

'如果s.intersection(v)'读得更好,但是你仍然需要建立一个新的集合,根据肯定的数量可能会也可能不会更快。 –

+0

@MosesKoledoye你是对的,但我认为可读性胜过这个问题的效率。为什么要高效,当你可以漂亮? – sgrg

+0

并且'如果len(s.intersection(set(v)))'比'if s.intersection(v)'更漂亮* –

相关问题