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

2024-09-27 21:26:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

现在,这三个列表中相同位置的元素相互对应。例如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]

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


Tags: 方法元素列表方式数字初学者名单新手
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

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

试试这个。你知道吗

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列表,然后使用它们的和作为键对它们进行排序,使最大的和排在第一位。如果您使用的是python2.7,那么可以使用izip而不是zip来减轻大型列表的内存负担,但是仍然需要创建完整的排序列表。在python中,3 zip相当于2.7的izip。你知道吗

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

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

要解释这个语句,请记住x是一个长度为3的tuples列表。你知道吗

  • 首先从x传递解压的tuples(使用表达式*x)。这将产生一个包含3tuples的新列表。第一个tuple包含x中元组的所有第一个元素,第二个tuple包含x中的所有第二个元素,依此类推。你知道吗
  • 现在您有了一个tuples列表,但是我们希望iterable包含lists,因此map是执行转换的正确函数。这将是快速的,因为它执行转换在本机c代码。结果是listlist
  • 最后,我们可以将listlists解压为3个独立的列表变量efg。你知道吗

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

相关问题 更多 >

    热门问题