Python 如何安排三个列表,使相应元素之和(如果大于)首先出现?

Python 如何安排三个列表,使相应元素之和(如果大于)首先出现?,python,list,Python,List,我是python新手。我有三个相同长度的浮动列表。这些数字随机分布在所有列表中。但是一个列表中元素的位置对应于其他列表中相同位置的其他元素。让我们假设列表是 a=[1,5,3,2,4] b=[20,30,50,40,10] c=[400500100300200] 现在,这三个列表中相同位置的元素相互对应。Like 1、20和400相互对应;3、50和100相互对应,以此类推。 我必须以这样的方式排列数字:对于这三个列表中的任何位置I,如果相应数字的总和大于,那么这三个数字应该首先出现在列表中。喜

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

a=[1,5,3,2,4]
b=[20,30,50,40,10]
c=[400500100300200]

现在,这三个列表中相同位置的元素相互对应。Like 1、20和400相互对应;3、50和100相互对应,以此类推。 我必须以这样的方式排列数字:对于这三个列表中的任何位置I,如果相应数字的总和大于,那么这三个数字应该首先出现在列表中。喜欢

e=[500400300200100]
f=[30,20,40,10,50]
g=[5,1,2,4,3]


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

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

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

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

试试这个

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
创建一个
元组列表
,然后使用它们的和作为键对它们进行排序,将其反转,使最大的和排在第一位。如果您使用的是Python2.7,那么可以使用
izip
而不是
zip
来减少大型列表的内存负担,但是仍然需要创建完整的排序列表。在Python3中,zip相当于2.7的
izip

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

为了解释这句话,请记住x是长度为3的
元组列表

  • 首先将解包的
    元组从x压缩(使用表达式
    *x
    )。这将产生一个包含3个
    元组的新列表。第一个
    元组
    包含x中元组的所有第一个元素,第二个
    元组
    包含x中的所有第二个元素,依此类推
  • 现在您有了一个
    元组列表
    ,但我们希望我们的iterable包含
    列表
    ,因此
    映射
    是执行转换的正确函数。它在本地c代码中执行转换时会很快。结果是一个
    list
    list
  • 最后,我们可以将
    列表的
    列表
    解压为3个单独的列表变量
    e
    f
    g

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

浮动列表。这些是INT列表。请发布您尝试过的内容,包括任何错误或回溯的全文。我需要列表作为最终产品。但印刷品是不可复制的。如何获得三个列表?您可以使用
j,k,l=map(list,zip(*x))
instead@JonClements谢谢,我想这还可以改进。我没有使用3个列表在一个循环中完成它,因为这是更多的代码。@JonClements,但它不再工作了。再次闲置“不响应”;numpy通信可能会帮助我…嗨@VikramadityaMondal移动球门柱!我没有时间修改我的答案,但也许生成器是最好的解决方案,以避免在内存中实际创建完整的列表。@Vikram我不认为JonClements建议如何使我的答案与您的更新要求相匹配,他只是建议在将元组列表转换回3个列表时避免运行3个循环。
e, f, g = map(list, zip(*x))