【问题标题】:Nested loop with conditional list comprehension具有条件列表理解的嵌套循环
【发布时间】:2022-11-07 21:43:10
【问题描述】:

我有 2 个清单

l1 = [['a',1],['b',2],['c',3]] l2 = [['b',2,10],['c',3,8]]

我希望使用 python 中的列表理解来复制以下代码:

for i in range(len(l1)):
    cnt = 0
    for j in range(len(l2)):
        if (l1[i][0]==l2[j][0]) & (l1[i][1]==l2[j][1]):
            cnt = 1
    if cnt==1:
        isintb.append(1)
    else:
        isintb.append(0)

预期输出:[0,1,1]

你们能帮忙吗?

我尝试如下:

[[1 if (l1[i][0]==l2[j][0]) & (l1[i][1]==l2[j][1]) else 0 for j in range(len(l2))] for i in range(len(l1))]

得到如下输出: [[0, 0], [1, 0], [0, 1]]

【问题讨论】:

  • 您确定要通过使用列表推导来使您的代码更加模糊吗?通常,您要问的是糟糕的编码习惯。提示:如果很难实现列表理解,那就不要。
  • 替换逻辑&和和使您的代码按预期工作
  • 即使将 & 替换为 and 也不会使其工作,除非将条件放在循环内,并且每次迭代时将 cnt 设置回 0。
  • @SembeiNorimaki 实际上它确实可以使用这些数据,尽管这是一种荒谬的方法
  • 如果您总是查看第二个列表的前两个元素,那么首先列出l2 中的前两个元素可能会更清楚。然后看起来像[1 if it in [l[:2] for l in l2] else 0 for it in l1]

标签: python list-comprehension nested-loops


【解决方案1】:

由于内部实际上检查是否有任何匹配项,您可以在列表推导中使用 any 并将 bool 转换为 int

isintb = [int(any((l1[i][0] == l2[j][0]) & (l1[i][1] == l2[j][1]) for j in range(len(l2)))) for i in range(len(l1))]
# [0, 1, 1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2019-06-07
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多