count_something = len([x for x in blah if x in foo]) 或 len(set(blah) & set(foo)) 是否太晦涩?
我使用列表推导的频率大概和任何中级或高级的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
如果你只是想检查一个字典里的列表中有零个、一个或多个元素,其实不需要遍历整个列表。这样做可以节省时间,特别是当列表很大或者很早就找到了结果的时候。
>>> 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
4
这个条件 x in some_dict(x)
看起来很复杂,其实你可以去掉 (x)
部分。
你不需要创建一个列表,可以试试这样写:
some_count = sum(1 for x in some_list if x in whatever)
你用集合的方式看起来是最容易理解的,不过可能不是最快的做法。