Python 如何安排三个列表,使相应元素之和(如果大于)首先出现?
我是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,如果相应数字的总和大于,那么这三个数字应该首先出现在列表中。喜
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))