【问题标题】:How to arrange three lists in such a way that the sum of corresponding elements if greater then appear first?如何排列三个列表,以使相应元素的总和首先出现?
【发布时间】:2015-06-04 21:57:35
【问题描述】:

我是 python 新手。我有三个相同长度的浮动列表。这些数字随机分布在所有列表中。但是一个列表中元素的位置对应于其他列表中相同位置的其他元素。假设列表是,

a=[1,5,3,2,4] b=[20,30,50,40,10] c=[400,500,100,300,200]

现在,这三个列表中相同位置的元素相互对应。 Like 1、20、400相互对应; 3、50和100相互对应,依此类推。 我必须以这样一种方式排列数字,即对于这三个列表的任何位置 i,如果相应数字的总和更大,那么这三个数字应该首先出现在列表中。像, e=[500, 400, 300, 200, 100] f=[30,20,40,10,50] g=[5,1,2,4,3]

所以相应数字的位置已经完全改变了。或者他们的通信不能中断。作为一个初学者,我尝试了很多方法,但都是徒劳的。请帮帮我。

【问题讨论】:

  • 浮动列表。这些是整数列表。
  • 请发布您尝试过的内容,包括任何错误或追溯的全文。

标签: python list


【解决方案1】:

作为对原始问题的回答(预编辑)

试试这个。

a=[1,5,3,2,4]
b=[20,30,50,40,10]
c=[400,500,100,300,200]

x = sorted(zip(a,b,c), key=lambda x: sum(x), reverse=True)

e, f, g = map(list, zip(*x))

print e
print f
print g

输出

[5, 1, 2, 4, 3]
[30, 20, 40, 10, 50]
[500, 400, 300, 200, 100]

使用zip 创建tuples 的列表,然后使用它们的总和作为键对它们进行排序,颠倒以便最大的总和在前。如果您使用的是 python 2.7,则可以使用 izip 而不是 zip 以在一定程度上减少大型列表的内存负担,但仍需要创建完整的排序列表。在 python 3 中,zip 相当于 2.7 的 izip

sorted 函数将返回元组列表,因此您现在想将它们转换回原来的 3 列表格式。最快、最干净的方法(@JohnClements 提供)。

e, f, g = map(list, zip(*x))

为了解释这个语句,记住 x 是一个 tuples 的列表,每个长度为 3。

  • 首先从 x 压缩解压的 tuples(使用表达式 *x)。这会产生一个包含 3 个tuples 的新列表。第一个 tuple 包含 x 中元组的所有第一个元素,第二个 tuple 包含 x 中的所有第二个元素,依此类推。
  • 现在您有一个tuples 的列表,但我们希望我们的可迭代对象包含lists,因此map 是用于进行转换的正确函数。它将在本机 c 代码中执行转换时很快。结果是listlists。
  • 最后,我们可以将listslist 解包为3 个单独的列表变量efg

如果您需要更详细地了解代码,我建议您在中间阶段打印输出。

【讨论】:

  • 代替 3 个列表组合 - 您可以使用 j, k, l = map(list, zip(*x)) 代替
  • @JonClements 谢谢我,虽然这可以改进。我没有在一个循环中使用 3 个列表,因为它是更多代码。
  • @JonClements 但它不再工作了。再次闲置“不响应”; numpy 对应可能对我有帮助...
  • 嗨@VikramadityaMondal 移动球门柱!我没有时间修改我的答案,但也许生成器是最好的解决方案,以避免在内存中实际创建整个列表。
  • @Vikram 我不认为 JonClements 是在建议如何使我的答案符合您更新的要求,他只是建议在将元组列表转回 3 个列表时避免运行 3 个循环的方法。
【解决方案2】:

您可以将列表的值排序为:

a=[1,5,3,2,4]
b=[20,30,50,40,10]
c=[400,500,100,300,200]

x = sorted(range(len(a)), key = lambda x:a[x]+b[x]+c[x], reverse = True)

print "\n".join([" ".join([str(j[i]) for i in x])for j in [a, b, c]])

>>> 5 1 2 4 3
    30 20 40 10 50
    500 400 300 200 100

【讨论】:

  • 我需要列表作为最终产品。但是打印的输出是不可迭代的。如何获得三个列表?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 2012-01-14
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多