如何根据每个元组中的最小值拆分元组列表?

How to split a list of tuples based on the minimum value in each tuple?

假设我有一个元组列表(为了简单起见,我将在示例中只放入 6 个值),如下所示:

x = [(1,2,3), (2,3,1), (0,10,100), (4,0,5), (2,1,3), (3.3,9,1.2), (4.5,2,0), (2,4,10), (100, 10, 30)]

列表x是一个元组列表,每个元组有3个值,所以只有3个索引。

我想要的是将列表 x 拆分为 3 个列表,第一个列表在第一个索引处的元组中具有最小值,第二个列表在第二个索引处具有元组中的最小值索引,第三个列表在第三个索引处具有元组的最小值。基本上,我需要输入每个元组以查看最小值在哪里(在哪个索引处)并将元组放入它所属的子列表中。

所以我会得到这样的结果:

x1 = [(1,2,3), (0,10,100), (2,4,10)]
x2 = [(4,0,5), (2,1,3), (100, 10, 30)]
x3 = [(2,3,1), (3.3,9,1.2), (4.5,2,0)]

通过简单检查的列表理解可以为您提供所需的输出:

x = [(1,2,3), (2,3,1), (0,10,100), (4,0,5), (2,1,3), (3.3,9,1.2), (4.5,2,0), (2,4,10), (100, 10, 30)]

x1 = [i for i in x if i[0] == min(i)]
x2 = [i for i in x if i[1] == min(i)]
x3 = [i for i in x if i[2] == min(i)]

您可以简单地循环执行:

import numpy as np
x = [(1,2,3), (2,3,1), (0,10,100), (4,0,5), (2,1,3), (3.3,9,1.2), (4.5,2,0), (2,4,10), (100, 10, 30)]
Xs = {0:[],1:[],2:[]} #For indexing 


for t in x:
    idx = np.argmin(t)
    Xs[idx].append(t)

x1 = Xs[0]
x2 = Xs[1]
x3 = Xs[2]

使用collections.defaultdict的一种方式:

from collections import defaultdict

d = defaultdict(list)

def argmin(arr):
    return min(range(len(arr)), key=lambda x: arr[x])

for t in x:
    d[argmin(t)].append(t)

或使用numpy.argmin:

for i, t in zip(np.argmin(x, 1), x):
    d[i].append(t)
    

输出:

defaultdict(list,
            {0: [(1, 2, 3), (0, 10, 100), (2, 4, 10)],
             2: [(2, 3, 1), (3.3, 9, 1.2), (4.5, 2, 0)],
             1: [(4, 0, 5), (2, 1, 3), (100, 10, 30)]})

您可以使用列表理解轻松地做到这一点:

abc = [(1,2,3), (2,3,1), (0,10,100), (4,0,5), (2,1,3), (3.3,9,1.2), (4.5,2,0), (2,4,10), (100, 10, 30)]


x1 = [x for x in abc if x.index(min(x))==0]
x2 = [x for x in abc if x.index(min(x))==1]
x3 = [x for x in abc if x.index(min(x))==2]

print(x1)
print(x2)
print(x3)

Output:
[(1, 2, 3), (0, 10, 100), (2, 4, 10)]
[(4, 0, 5), (2, 1, 3), (100, 10, 30)]
[(2, 3, 1), (3.3, 9, 1.2), (4.5, 2, 0)]
def meth(a):
    if a[0] < a[1] and a[0] < a[2]:
        return 1
    if a[0] > a[1] and a[0] < a[2]:
        return 0
    return -1
x = sorted(x, key=meth)
print(x[:3])
print(x[3:6])
print(x[6:9])

您可以在不导入的情况下执行此操作,只需在输入列表上传递一次即可。

  • 用三个空子列表初始化结果列表。
  • 遍历每个元组,并将其附加到元组中最小元素的匹配索引中的子列表。
  • 最后,每个子列表将包含最小元素与子列表在同一索引中的元组:
x = [(1,2,3), (2,3,1), (0,10,100), (4,0,5), (2,1,3), (3.3,9,1.2), (4.5,2,0), (2,4,10), (100, 10, 30)]

mins = [[], [], []]
for tup in x:
    mins[tup.index(min(tup))].append(tup)

print(mins)

将给予:

[[(1, 2, 3), (0, 10, 100), (2, 4, 10)],    # mins[0] - tuples with minimum in index 0
 [(4, 0, 5), (2, 1, 3), (100, 10, 30)],    # mins[1] - tuples with minimum in index 1
 [(2, 3, 1), (3.3, 9, 1.2), (4.5, 2, 0)]]  # mins[2] - tuples with minimum in index 2