我使用列表推导可能与任何中级或高级Python程序员一样多。我尽量不要过度使用它。
我很好奇这是不是很模糊或只是简洁:
some_count = len([x for x in some_list if x in some_dict])
......代替:
some_count = 0
for x in some_list:
if x in some_dict:
some_count += 1
在实际情况下我看着我甚至可以使用:
some_count = len(set(some_list) & set(some_dict))
(假设some_list中的项目保证不同)。
特别是我有一个函数返回一个(可能是空的)字符串列表(来自外部的专有数据存储)。应该是这样的情况,其中只有一个是我的代码中的字典中的有效密钥。如果它为零,我应该发一个警告,如果它是一个我应该只是我的代码中的值,如果它不止一个我应该发出错误。
我只是在这里征求风格意见。
答案 0 :(得分:4)
条件x in some_dict(x)
非常模糊;看起来你需要丢失(x)
。
您无需构建列表;试试这个:
some_count = sum(1 for x in some_list if x in whatever)
您的设定方法似乎是最容易理解的。然而,它不太可能是最快的。
答案 1 :(得分:0)
如果您真的只想测试dict中列表中是否有零个,一个或多个元素,则不必遍历整个列表。如果列表很大并且有很多(或一些早期的)命中,这可能会节省一些时间。
>>> def f(lst, dic):
... it = iter(lst)
... if any(x in dic for x in it):
... if any(x in dic for x in it):
... print("twice or more")
... else:
... print("exactly once")
... else:
... print("not at all")
...
>>> f([1, 2, 3], {0:0})
not at all
>>> f([1, 2, 3], {0:0, 1:1})
exactly once
>>> f([1, 2, 3], {0:0, 1:1, 2:2, 3:3})
twice or more