【问题标题】:Convert one list to set, but if empty use a default one将一个列表转换为设置,但如果为空,则使用默认列表
【发布时间】:2012-03-11 18:54:51
【问题描述】:

如果列表不为空,我正在寻找一种更好的方法来分配具有列表内容的集合,否则应使用另一个列表。

如果可能的话,我想要一个更好的方式来写这个(或者一个为什么这是最好的方式的论据):

if args.onlyTheseServers:
    only = set(args.onlyTheseServers)
else:
    only = set(availableServers)

【问题讨论】:

  • 请记住,官方 Python 风格指南 (PEP 8) 不喜欢你调用你的变量或属性 onlyTheseServers;它会更喜欢only_these_servers 之类的。
  • is not None 如果您传递一个空列表,则为 True,您真的希望条件为空列表还是变量为 None?
  • @Chris Morgan:谢谢!我会仔细阅读并采用。我有点Java。 :-)
  • @Geekfish:我写了if args.onlyTheseServers is not None: 但是是的,如果 onlyTheseServers 是一个空列表,我确实希望条件为假。感谢您发现它!我将其更改为if args.onlyTheseServers:

标签: python list set


【解决方案1】:
only = set(args.onlyTheseServers or availableServers)

【讨论】:

  • 这与原始的语义略有不同。这可能或可能无关紧要,但如果 args.onlyTheseServers 是一个空列表,那么原始列表会生成一个空集,而您的版本将使用默认值。
  • 确实如此。语义与他的示例代码不同,但实际上与问题标题匹配(“......如果列表不为空,则与列表的内容......”)。
  • 我的代码示例中有一个错误。因此,尽管我的示例有问题,但您还是按照我的意愿解释了它。谢谢!
【解决方案2】:

查看您以前的question,我想说您真正要寻找的是一种使用argparse 为缺少的参数分配默认值的方法。在这种情况下,您应该只使用default,如下所示:

parser.add_argument('-o', '--only', default=default_servers, ...)

这样,当-o/--only 选项未通过时,命名空间将正确设置默认值。

【讨论】:

  • 注意到了。我想这确实是他想要的。我现在很生气,因为我自己没有想到它......没有将它与上一个问题联系起来,我 had 将它与 argparse 联系起来,因为变量名 args!
  • @Chris Morgan:嗯,我是一个令人困惑的提问者。很抱歉!
  • 不错的演绎!我已经按照你建议的方式解决了。但是,为了让我的问题“独立存在”(并可能帮助其他人),我将另一个问题标记为我的首选答案。虽然感觉有点糟糕,但如果我能有更多的赞成票就好了。 :-)
【解决方案3】:

args.onlyTheseServers 似乎是来自argparse 的变量。

如果是这种情况,您应该检查 default 参数和 set_default() 方法。

这是一个例子:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*', default=['1', '2', '3'])
>>> args = parser.parse_args()
>>> args.foo
['1', '2', '3']
>>> args = parser.parse_args(['--foo', 'a', 'b'])
>>> args.foo
['a', 'b']

【讨论】:

  • 不错的演绎!我已经按照你建议的方式解决了。但是,为了让我的问题“独立存在”(并可能帮助其他人),我将另一个问题标记为我的首选答案。虽然感觉有点糟糕,但如果我能有更多的赞成票就好了。 :-)
  • @Kent:别担心 :) (以后如果您对接受哪个答案有疑问,here 有参考)
【解决方案4】:

并没有好很多,但至少短一点:

only = set(availableServers if args.onlyTheseServers is None 
           else args.onlyTheseServers)

你也可以这样做

only = set(args.onlyTheseServers or availableServers) 

它的工作方式略有不同,因为它不测试 None,但前提是参数为 true-is - 在这种情况下它应该可以工作。

【讨论】:

    【解决方案5】:

    叫我疯狂购买我更喜欢这个

    only = set(args.onlyTheseServers) if args.onlyTheseServers is not None else set(availableServers)
    

    【讨论】:

    • 我实际上不得不称你为那个疯了。 ;-) 但感谢您的回答!投零票(否决正确答案将是残酷的)。 :-)
    • @Kent,呵呵。这是因为我完全购买了 pep 308 文档中给出的“一个案例是常见的,应该是第一个”的解释。docs.python.org/release/2.5/whatsnew/pep-308.html 所以你只阅读它 = set(args.onlyTheseServers) ... bla bla 一些特殊情况在这里处理...
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 2017-05-15
    • 1970-01-01
    • 2016-07-05
    • 2023-01-14
    • 2020-10-15
    • 2020-07-20
    • 2014-10-03
    相关资源
    最近更新 更多