【问题标题】:If-else List of lists comprehension [closed]If-else 列表理解列表 [关闭]
【发布时间】:2021-07-31 17:27:59
【问题描述】:

我有以下列表:

list1 = [[1,"one"],[2,"two"],[3,"three]]

我想要输出:

list2 = [[11,"one"],[2,"two"],[3,"three"]]

使用 if-else 语句的列表推导似乎是一个不错的选择。

list2 = [x if x[0] != 1 else 11 for x[0] in list1]

但是,我得到了未定义“x”的 NameError。我应该如何定义 x?

【问题讨论】:

  • 你的意思是for x in list1x[0] 不是绑定名称的合法方式。
  • 不,好像我这样做,它输出 list2 = [11,[2,"two"],[3,"three"]]
  • 不,您目前收到的是NameError,上面的评论解决了这个问题。
  • [x if x[0] != 1 else [11, x[1]] for x in list1]
  • @gumrana Carcigenicate 的上述评论确实解决了错误,但并没有解决我的问题。多亏了 Mady Daby 和 ThePyGuy,现在一切都解决了!非常感谢你们!

标签: python list list-comprehension


【解决方案1】:

你不能做for x[0] in <iterable>,你需要使用整个inner-list/sequence。要获得您正在寻找的结果,您可以使用二级列表理解,或者仅使用具有一级理解的列表连接,如下所示:

>>> [x if x[0]!=1 else [11]+x[1:] for x in list1]
[[11, 'one'], [2, 'two'], [3, 'three']]

【讨论】:

    【解决方案2】:

    使用列表推导式,您必须重建整个子列表,因为无法改变列表使用单个表达式获得结果:

    list2 = [x if x[0] != 1 else [x[0]+10, x[1]] for x in list1]
    

    (使用*x 而不是x[1] 泛化到更长的子列表。)

    使用普通的for 循环,如果您不需要浅拷贝,您可以简单地改变现有列表。

    for x in list1:
        if x[0] == 1:
            x[0] += 10
    

    (在每种情况下,您都可以用硬编码的 11 替换加法 10,因为如果条件成功,您知道 x[0] 的确切值。)

    【讨论】:

      【解决方案3】:

      您需要对代码进行一些更改。我发现了以下问题:

      • 您需要遍历整个列表,因此您需要以下行:x in list1 而不是 x[0] in list1
      • 您需要将子列表的两个元素都添加回来,目前您直接添加了 x 而没有修改

      list2 = [[11, x[1]] if x[0] == 1 else x for x in list1]

      【讨论】:

        猜你喜欢
        • 2018-04-27
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 2022-01-05
        • 2013-06-23
        • 2023-03-29
        相关资源
        最近更新 更多