【问题标题】:Is count_something = len([x for x in blah if x in foo]) or len(set(blah) & set(foo)) too obscure? [closed]count_something = len([x for x in blah if x in foo]) 或 len(set(blah) & set(foo)) 是否太晦涩难懂? [关闭]
【发布时间】:2012-02-11 09:46: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 中的项目保证是不同的)。

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

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

【问题讨论】:

  • 不应该...if x in some_dict(x)(在你的列表理解中)是...if x in some_dict
  • 是的,我开始以一种方式写问题并改变了我试图提出问题的方式。
  • 我几乎可以立即理解列表理解版本,扩展形式相当快,集合版本很快(我经常以这种方式使用这种集合操作)。
  • 您的代码使用了minimal 完整(= 包括过滤条件)列表理解。如果 that 太晦涩难懂,那么您根本无法使用列表推导。所以这个问题没有实际意义。

标签: python coding-style set list-comprehension


【解决方案1】:

条件x in some_dict(x) 非常模糊;看起来你需要失去(x)

你不需要建立一个列表;试试这个:

some_count = sum(1 for x in some_list if x in whatever)

您的固定方法似乎是最容易理解的。但是,它可能不是最快的。

【讨论】:

  • 对不起,应该是 some_dict;我开始把它写成 some_test(x) ...但是当我编辑我的问题时,我决定像在 some_dict 中那样澄清这一点,因为那是我正在执行的实际测试。
  • 我一直忘记我可以返回一个常量(例如 1)来进行列表理解。我非常习惯于返回项目或这些项目的一些衍生物,而不是简单的常量。
  • 你也可以把后者写成sum(x in dic for x in lst)
【解决方案2】:

如果您真的只想测试 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

【讨论】:

  • 是的,这是真的。但是,在这种情况下,它们的数量永远不会超过少数(由于所涉及的现实世界实体的性质。它们是服务器,这是它们所属的集群的列表。警告如果您尝试将此命令应用于其中一个集群中的事物,如果其中任何一个是这些集群中的多个集群的成员,则错误,因为它们旨在相互排斥。只有几百个集群和一个以上的主机很少,几乎没有。
猜你喜欢
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多