【问题标题】:Combinations on a list in pythonpython中列表上的组合
【发布时间】:2020-03-10 15:03:21
【问题描述】:

所以我在 python 中得到了一个这样的列表:

[1,2,3,4]

我想要数字 3 与每个数字之间的组合,如下所示:

[(1,3),(2,3),(3,4)]

有什么我可以使用的吗?我知道有一个叫做 itertools 的东西,但我有点新,所以我不知道如何使用它。

谢谢!

【问题讨论】:

  • itertools 组合和排列有据可查,此站点上有许多示例。试试看
  • 您不需要itertools
  • 你想要这个输出:[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)] 吗?
  • 不完全是,只是一个位置(在本例中为 3)到其他位置
  • 元素的顺序重要吗? (4,3) 可以吗?作为一个元素?

标签: python list combinations itertools


【解决方案1】:

您可能想要使用列表推导:

orig_list = [1,2,3,4]
[(entry, 3) for entry in orig_list if entry != 3] # [(1, 3), (2, 3), (4, 3)]

如果您对重复值不感兴趣,您可以将其组合成一个集合:

orig_list = set([1,2,3,4])
[(entry, 3) for entry in orig_list if entry != 3] # [(1, 3), (2, 3), (4, 3)]

【讨论】:

  • 如果您不想使用该变量,通常会使用_ 作为变量
  • 这太好了,对我帮助很大,谢谢!如果我也想要其他职位怎么办?不仅是 (1,3),还有 (3,1)?
【解决方案2】:

一个简单的方法是使用循环:

list2 = []
for x in list1:
     list2.append((x,3))
print(list2)

如果你想摆脱 (3,3) 使用:

list2 = []
for x in list1:
     if x != 3:
          list2.append((x,3))
print(list2)

【讨论】:

    【解决方案3】:

    您可以将列表推导与itertools.combinations 一起使用:

    import itertools
    
    [e for e in itertools.combinations([1,2,3,4], 2) if 3 in e]
    

    输出:

    [(1, 3), (2, 3), (3, 4)]
    

    你可以使用itertools.repeat

    from itertools import repeat
    
    l = [1,2,3,4]
    [(f, s) for f, s in zip(l, repeat(3)) if f != 3]
    

    输出:

    [(1, 3), (2, 3), (4, 3)]
    

    【讨论】:

    • 注意:这会将O(n) 问题变成O(n²) 问题(n 选择2 是n * (n - 1) / 2 工作);对于您生成的每个值,您必须过滤掉 ~n。如果输入长度为 4 则很好,如果长度为 1000 则更少。
    • 我的第二个解决方案是 O(n) 时间复杂度,应该没问题,也许是最快的
    【解决方案4】:

    你可以使用:

    l = [1,2,3,4]
    [(l[i], 3) for i in range(l.index(3))] + [(3, l[i]) for i in range(l.index(3)+1, len(l))]
    

    给出输出:

    [(1, 3), (2, 3), (3, 4)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 2014-09-11
      • 2017-10-31
      相关资源
      最近更新 更多