【问题标题】:Combine multiple lists of tuples into new lists of tuples by order of tuple in list (python3)按列表中的元组顺序将多个元组列表组合成新的元组列表(python3)
【发布时间】:2018-10-10 07:56:15
【问题描述】:

我有多个包含两个值的元组列表,例如:

[('0','2'), ('0','2'), ('1','0')]
[('2','2'), ('0','0'), ('0','2')]
[('0','0'), ('2','1'), ('2','1')]
[('0','2'), ('2','0'), ('0','2')]

我想创建一组包含元组的新列表,这些列表按它们在列表中出现的顺序排列。例如在上面的例子中,我想要的输出是:

[('0','2'), ('2','2'), ('0','0'), ('0','2')]
[('0','2'), ('0','0'), ('2','1'), ('2','0')]
[('1','0'), ('0','2'), ('2','1'), ('0','2')] 

我在思考如何解决这个问题时遇到了麻烦,因为元组没有唯一的键值,而实际列表每个包含大约 500 个元组。在列表中的位置是我新分组的重要品质。如果有帮助,每个列表都在文件的新行上。

有人有什么建议吗?

【问题讨论】:

  • 所有列表的长度都一样吗?
  • 所以你想转置输入?
  • @AndrewMcDowell 是的,每个列表的长度相同。
  • Transpose list of lists的可能重复
  • @Aran-Fey 我对 python 还很陌生,所以我需要查看你的术语,但据我所知,这就是我的意图。

标签: python python-3.x list tuples


【解决方案1】:

尝试使用简单的zip*

a = [
       [('0','2'), ('0','2'), ('1','0')],
       [('2','2'), ('0','0'), ('0','2')],
       [('0','0'), ('2','1'), ('2','1')],
       [('0','2'), ('2','0'), ('0','2')]
    ]


list(zip(*a))

输出将是:

[(('0', '2'), ('2', '2'), ('0', '0'), ('0', '2')),
 (('0', '2'), ('0', '0'), ('2', '1'), ('2', '0')),
 (('1', '0'), ('0', '2'), ('2', '1'), ('0', '2'))]

【讨论】:

  • 感谢您的回复。为了清楚起见,我需要将每个列表嵌套到一个列表中吗?如果我使用类似的东西生成了每个列表:(...上面读取 csv 文件的代码,包括导入 itertools (it)...) for row_number, row in read_lines(reader, r): row_tuples = list(it.combinations (row, 2)) 我需要添加一行,例如: rows_combined = [row_tuples]
  • @MatthewLollar 欢迎您,我应该说是的,这意味着如果您需要执行所需的操作,您需要从 CSV 文件加载所有数据并将其转换为上述格式,然后运行zip 函数。
【解决方案2】:

也许做这样的事情:

a = [[('0','2'), ('0','2'), ('1','0')],
    [('2','2'), ('0','0'), ('0','2')],
    [('0','0'), ('2','1'), ('2','1')],
    [('0','2'), ('2','0'), ('0','2')]]

res = list(map(list, (zip(*a))))
print(res)

【讨论】:

    【解决方案3】:

    如果您的输出不是元组列表,您也可以使用 numpy 执行此操作:

    import numpy as np
    arr = np.transpose([[('0','2'), ('0','2'), ('1','0')],
                    [('2','2'), ('0','0'), ('0','2')],
                    [('0','0'), ('2','1'), ('2','1')],
                    [('0','2'), ('2','0'), ('0','2')]], axes=[1,0,2])
    

    它将返回一个 3D ndarray。

    【讨论】:

      猜你喜欢
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 2022-08-18
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多