Python 比较列表的元素并返回列表

Python 比较列表的元素并返回列表,python,list,Python,List,我有一个列表列表,我不知道主列表的长度,但每个“子列表”必须包含6个浮动。我需要比较每个子列表的每个浮点值,前三个浮点值保留较小的一个,后三个浮点值保留较大的一个,最后,我需要以相同的顺序返回6浮点列表中的所有这些值 以下是一个例子: list1 = [[-2.0, 0.0, -2.0, 2.0, 10.0, 2.0], [-1.0, 0.0, 2.0, 1.0, 5.0, 4.0]] # Compare list1[0][0] with list1[1][0] # Will return -2

我有一个列表列表,我不知道主列表的长度,但每个“子列表”必须包含6个浮动。我需要比较每个子列表的每个浮点值,前三个浮点值保留较小的一个,后三个浮点值保留较大的一个,最后,我需要以相同的顺序返回6浮点列表中的所有这些值

以下是一个例子:

list1 = [[-2.0, 0.0, -2.0, 2.0, 10.0, 2.0], [-1.0, 0.0, 2.0, 1.0, 5.0, 4.0]]
# Compare list1[0][0] with list1[1][0]
# Will return -2.0 (because the index is between 0 and 2 so it returns the lower float)
# Compare list1[0][4] with list1[1][4]
# Will return 10.0 (because the index is between 3 and 5 so it returns the higher float)
# The final result which should be returned is:
# [-2.0, 0.0, -2.0, 2.0, 10.0, 4.0]

list2 = [[-2.0, 0.0, -2.0, 2.0, 10.0, 2.0], [-1.0, 0.0, 2.0, 1.0, 5.0, 4.0], [3.0, 0.0, -1.0, 4.0, 1.0, 0.0]]
# Compare list2[0][2] with list2[1][2] with list2[2][2]
# Will return -2.0 (because the index is between 0 and 2 so it returns the lower float)
# The final result which should be returned is:
# [-2.0, 0.0, -2.0, 4.0, 10.0, 4.0]
我在这个网站上读到了关于
zip()
、集合、列表理解和不同的主题,但我没能达到我想要的目的。

如果你使用
zip(*list2)
,你将创建每个子列表的第一个元素的列表,第二个元素的列表,等等,所以你想得到前3个的最小值和后3个的最大值

zipped = zip(*list2)
result = [min(zipped[i]) for i in range(3)] + [max(zipped[i]) for i in range(3, 6)]
在Python3中,
zip()
将像迭代器一样缓慢地获取压缩的子列表,而在Python2中,它将提前创建整个列表。这类似于两个版本之间的
range()
。如果希望在Python2中实现延迟生成,可以使用itertools模块中的迭代器版本

import itertools

zipped = itertools.izip(*list2)
result = [min(zipped.next()) for _ in range(3)] + [max(zipped.next()) for _ in range(3)]
编辑:实现目标的可视化示例

>>> a = [[1, 2, 3], [4, 5, 6]]
>>> zip(*a) # you need `list(zip(*a))` in Python 3
[(1, 4), (2, 5), (3, 6)]
星形语法将列表解压为几个参数,这样
zip(*[[1,2,3],[4,5,6]])
就变成了
zip([1,2,3],[4,5,6])
,这就是您想要的。

您可以使用2个嵌套for循环“手动”完成它

list1 = [[-2.0, 0.0, -2.0, 2.0, 10.0, 2.0], [-1.0, 0.0, 2.0, 1.0, 5.0, 4.0]]
output = [0 for x in range(6)]
# iterate over the 6 numbers
for i in range(6):
    value = list1[0][i] # pick the first number
    #iterate over all the lists, if we find a bigger/smaller one our current one then save it
    for j in range(len(list1)):
        if i >= 3 and list1[j][i] > value:
                value = list1[j][i]
        elif i < 3 and list1[j][i] < value:
                value = list1[j][i]
    #put the biggest/smallest value in the correct place in the output array
    output[i] = value
print output
list1=[-2.0,0.0,-2.0,2.0,10.0,2.0],-1.0,0.0,2.0,1.0,5.0,4.0]]
输出=[0代表范围(6)内的x]
#迭代6个数字
对于范围(6)中的i:
value=list1[0][i]#选择第一个数字
#迭代所有列表,如果我们找到一个较大/较小的列表,则保存它
对于范围内的j(len(列表1)):
如果i>=3且列表1[j][i]>值:
值=列表1[j][i]
elif i<3和列表1[j][i]<值:
值=列表1[j][i]
#将最大/最小值放在输出数组中的正确位置
输出[i]=值
打印输出
NumPy解决方案 您可以使用NumPy:

np.concatenate((np.min(a[:,:3], axis=0), np.max(a[:,3:], axis=0)))
完整示例 印刷品:

[-2.0, 0.0, -2.0, 2.0, 10.0, 4.0]
[-2.0, 0.0, -2.0, 4.0, 10.0, 4.0]

1.添加您的尝试。2.添加最终的预期输出@Bhargav Rao-抱歉,我添加了预期返回的结果。但我承认我在做出任何令人信服的尝试之前就放弃了……谢谢!第一个是完美的,现在对我来说更容易理解。但我也会看看你的第二个解决方案@UKDP我更新了我的答案,提到Python 3中的
zip()
的行为有些不同。为了理解这一点和
itertools.izip()
,您需要深入了解。
[-2.0, 0.0, -2.0, 2.0, 10.0, 4.0]
[-2.0, 0.0, -2.0, 4.0, 10.0, 4.0]