如何根据每个元组中的最小值拆分元组列表?
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
假设我有一个元组列表(为了简单起见,我将在示例中只放入 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