【问题标题】:How to create a list conditionally?如何有条件地创建列表?
【发布时间】:2020-01-23 23:20:07
【问题描述】:

我有以下问题。我想有条件地形成一个列表a

假设我有一个变量add_string,如果它是True,那么

a = ["a","b","Added String","c"]

其他

a = ["a","b","c"]

最好的方法是什么?我可以通过以下方式做到这一点

a = ["a","b","c"]
if add_string:
  a.insert(2,"Added String")

但这并不理想,因为列表a 将来可能会更改,我将不得不更改插入函数中的索引。我还有一个条件——这个添加的字符串应该总是跟在“b”之后。另一种解决方案是在列表中搜索“b”,然后在之后插入,但这会增加复杂性并且很难看。

理想情况下,我认为应该是这样的

a = ["a","b",if add_string then "Added String","c"]

【问题讨论】:

  • 这听起来像XY problem。您认为需要采用这种方法的原因是什么?
  • 这正是我想要实现的。当然,列表名称和值是不同的。但基本上我试图在函数 X 中形成一个对象列表。这个函数是从另一个函数 Y 调用的。传递的参数之一是我必须添加到列表中的那个对象。有时这个对象被传递,有时没有。目前我正在使用插入。所以我想知道我是否可以通过其他方式做到这一点。

标签: python list if-statement


【解决方案1】:
a = ["a","b"] + (["Added String"] if add_string else []) + ["c"]

【讨论】:

    【解决方案2】:

    如果您在创建 a 时知道所有值,则可以执行以下操作:

    add_string = True
    a = ['a', 'b'] + (['Added String'] if add_string else []) + ['c']
    

    输出:

    ['a', 'b', 'Added String', 'c']
    

    如果您不知道a 中的值,可以使用indexa 中查找'b' 的位置,然后插入字符串:

    a = ["a","b","c"]
    add_string = True
    if add_string:
        a.insert(a.index("b")+1,"Added String")
    print(a)
    

    输出:

    ['a', 'b', 'Added String', 'c']
    

    【讨论】:

    • 我知道我可以做到这一点,我在帖子中提到过“另一种解决方案是在列表中搜索“b”然后插入,但这会增加复杂性并且很难看”
    • @Roman_T 创建列表时您知道a 中的所有值吗?
    • 现在我知道了。但是该列表将来可能会更改,并且可以将新值添加到列表的开头,这将影响索引
    • @Roman_T 如果您要向列表中添加值,则很难看出如何在没有索引的情况下执行此操作...
    【解决方案3】:

    您可以将不需要的值设置为已知值(例如 None),然后使用列表解析将它们删除:

    add_string = False  # Could be True
    unfiltered_list = ["a","b","Added String" if add_string else None,"c"]
    a = [x for x in unfiltered_list if x is not None]
    print(a)
    

    【讨论】:

      猜你喜欢
      • 2019-10-10
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      相关资源
      最近更新 更多