count_something = len([x表示x,如果x在foo中为x])或len(set(blah)& set(foo))太模糊了?

时间:2012-02-11 09:46:51

标签: python coding-style set list-comprehension

我使用列表推导可能与任何中级或高级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中的项目保证不同)。

特别是我有一个函数返回一个(可能是空的)字符串列表(来自外部的专有数据存储)。应该是这样的情况,其中只有一个是我的代码中的字典中的有效密钥。如果它为零,我应该发一个警告,如果它是一个我应该只是我的代码中的值,如果它不止一个我应该发出错误。

我只是在这里征求风格意见。

2 个答案:

答案 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