Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dict具有列表中的键_Python_List_Dictionary - Fatal编程技术网

Python Dict具有列表中的键

Python Dict具有列表中的键,python,list,dictionary,Python,List,Dictionary,如何确定是否有任何列表元素是dict的键? 直截了当的方法是 for i in myList: if i in myDict: return True return False 但是有没有更快/更简洁的方法呢?假设您正在谈论python,另一种方法是: #!python any(x in MyDict for x in MyList) set(MyList).intersection(MyDict) return len([x for x in myList if x in

如何确定是否有任何列表元素是dict的键? 直截了当的方法是

for i in myList:
   if i in myDict:
      return True
return False

但是有没有更快/更简洁的方法呢?

假设您正在谈论python,另一种方法是:

#!python
any(x in MyDict for x in MyList)
set(MyList).intersection(MyDict)
return len([x for x in myList if x in myDict]) > 0
除了
any(我的目录中的项目用于我的列表中的项目)
from:

或:

衡量相对绩效 需考虑的案例:

  • 列表开头的项位于字典中
  • 列表末尾的项在字典中
  • 字典中没有列表中的项
  • 要比较的函数(请参阅):

    结果:
    mgag\u loop()
    在所有情况下都是最快的

    1.列表开头的项位于字典中。

    2.列表末尾的项在字典中。

    3.字典中没有列表中的项。

    如何繁殖 下载并运行
    python main.py
    numpy
    matplotlib
    应安装以创建绘图)

    要更改输入列表的最大大小,相应地绘制供应点的点数
    --maxn
    --npoints
    。例如:

    $ python main.py --maxn 65536 --npoints 16
    
    关于一个相关问题:

    >>> if all (k in foo for k in ("foo","bar")):
    ...     print "They're there!"
    ...
    They're there!
    
    您可以对其进行调整,以检查字典中是否出现以下内容:

    >>> if any(k in myDict for k in ("foo","bar")):
    ...     print "Found one!"
    ...
    Found one!
    
    您可以对照密钥列表进行检查:

    >>> if any(k in myDict for k in myList):
    ...     print "Found one!"
    ...
    Found one!
    

    非常感谢大家。我测试了所有答案的性能,最快的是

    return len([x for x in myList if x in myDict]) > 0
    

    但我没有尝试“设置”答案,因为我不知道如何将它变成一行。

    @Dario:可能是boo,但我想答案还是一样的。过早优化是万恶之源。any()解决方案更加优雅。仅供参考,您应该使用复选标记来表示您已接受的答案,而不是像这样发布另一个答案。我看不出
    len()
    如何更快。你使用了什么输入?我已经衡量了所有答案的性能:
    any
    的关键优势是短路,而
    any(map(…
    失去了关键优势!太棒了。我对python不是很了解,今天通过阅读所有答案学到了很多。你的总结太棒了。你应该得到答案!:-)OMG。我明天回去测试一下。“亚历克斯:你说得对。我已经澄清了‘map’变体适用于Python 3.XI在这两个测试之间的测试,具体来说,LeN([X在NoDeLIST中,如果X在RelvoDo])>0 vs DEF MigaGrLob(MyDIST,MyLIST)。:对于myList中的i:if i in myDict:return True return False,三次运行的结果几乎相同(每次运行约80秒),误差在1%以内。第二个选项总是更快,但余量很小。+1表示清晰、高效(仅限第一个版本!),和simplicity.btw。如果
    MyDict'中的键不在
    MyList'的开头,则“set”版本比“any”版本快。这有两个问题:这不必要建立一个列表并查找所有出现的情况,而不会造成短路。
    def args_no_key(n):
        'Make args for comparison functions "no key" case.'
        d = dict.fromkeys(xrange(n))
        lst = range(n, 2*n+1)
        assert not any(x in d for x in lst)
        return (d, lst)
    
    $ python main.py --maxn 65536 --npoints 16
    
    >>> if all (k in foo for k in ("foo","bar")):
    ...     print "They're there!"
    ...
    They're there!
    
    >>> if any(k in myDict for k in ("foo","bar")):
    ...     print "Found one!"
    ...
    Found one!
    
    >>> if any(k in myDict for k in myList):
    ...     print "Found one!"
    ...
    Found one!
    
    return len([x for x in myList if x in myDict]) > 0