count_something = len([x for x in blah if x in foo]) 或 len(set(blah) & set(foo)) 是否太晦涩?

0 投票
2 回答
1061 浏览
提问于 2025-04-17 12:50

我使用列表推导的频率大概和任何中级或高级的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)

你用集合的方式看起来是最容易理解的,不过可能不是最快的做法。

撰写回答