Python-将元组列表拆分为子列表

Python-将元组列表拆分为子列表,python,list,tuples,Python,List,Tuples,我有一个元组列表,如下所示。列表中的元组是动态存储的。假设每个元组可以有6个元素或20个元素。这个计数是动态的 a = [('Index','col1','col2','col3','col4','col5'),('1','2','4','6','78','9'),('3','6','8','9','2','1')] 我想将列表中每个元组的前3个元素拆分为另一个列表(如下所示) 例2: tup=[(7,6,8,19,2,4,13,1,10,25,11,34),(1,2,3,4,5,6,7,8,

我有一个元组列表,如下所示。列表中的元组是动态存储的。假设每个元组可以有6个元素或20个元素。这个计数是动态的

a = [('Index','col1','col2','col3','col4','col5'),('1','2','4','6','78','9'),('3','6','8','9','2','1')]
我想将列表中每个元组的前3个元素拆分为另一个列表(如下所示)

例2:

tup=[(7,6,8,19,2,4,13,1,10,25,11,34),(1,2,3,4,5,6,7,8,9,10,11,12),(3,5,6,7,89,0,1,3,4,5,6,7)]
输出应该是这样的-

 [(7,6,8),(1,2,3)(3,5,6)]
 [(19,2,4),(4,5,6),(7,89,0)]
 [(13,1,10),(7,8,9),(1,3,4)]
 [(25,11,34),(10,11,12),(5,6,7)]

关于如何在python中实现这一点,您有什么建议吗?

您可以使用列表理解和索引切片来完成这项工作:

如果len(a[0])>3:
b=[x[:3]表示a中的x]
c=[x[3:]表示a中的x]

这可能不是最快的代码,但它非常清晰和简单。

如果数据大小发生变化,这是一种更灵活的方法

a = [('Index','col1','col2','col3','col4','col5'),('1','2','4','6','78','9'),('3','6','8','9','2','1')]
res = [[a[0][c:c+3], a[1][c:c+3], a[2][c:c+3]] for c in range(0,len(a[0]), 3)]
print(*res)
# [('Index', 'col1', 'col2'), ('1', '2', '4'), ('3', '6', '8')] [('col3', 'col4', 'col5'), ('6', '78', '9'), ('9', '2', '1')]
解决方案2:考虑到不同的元组大小,因此仅根据@Diego Palacios提到的最短元组以3的倍数进行迭代;)


您也可以使用熊猫来执行此操作:

# pd.DataFrame(a).T.groupby(np.arange(len(pd.DataFrame(a).T))//3).agg(list).to_numpy().tolist() 
# [[['Index', 'col1', 'col2'], ['1', '2', '4'], ['3', '6', '8']],
# [['col3', 'col4', 'col5'], ['6', '78', '9'], ['9', '2', '1']]]
第二个例子:

tup=[(7,6,8,19,2,4,13,1,10,25,11,34),(1,2,3,4,5,6,7,8,9,10,11,12),(3,5,6,7,89,0,1,3,4,5,6,7)]

pd.DataFrame(tup).T.groupby(np.arange(len(pd.DataFrame(tup).T))//3).agg(list).to_numpy().tolist() 
输出:

[[[7, 6, 8], [1, 2, 3], [3, 5, 6]],
 [[19, 2, 4], [4, 5, 6], [7, 89, 0]],
 [[13, 1, 10], [7, 8, 9], [1, 3, 4]],
 [[25, 11, 34], [10, 11, 12], [5, 6, 7]]]
我的解决方案:

def split_by(tuples, size=3):
    lens = [len(t) for t in tuples]
    n = min(lens)
    cnt = 0
    while cnt < n:
        result = [t[cnt:cnt+size] for t in tuples]
        yield result
        cnt += size
def split_by(元组,大小=3):
lens=[len(t)表示元组中的t]
n=最小值(镜头)
cnt=0
当cnt
一个处理动态列表和不同大小的行程序

def split_by(lst, size=3):
  return [[t[ind:ind+size] for t in a] for ind in range(0, min(map(len, a)), size)]

print(split_by(a))
输出

[   [('Index', 'col1', 'col2'), ('1', '2', '4'), ('3', '6', '8')],    
    [('col3', 'col4', 'col5'), ('6', '78', '9'), ('9', '2', '1')]]

第一个列表中的第二项不应该是('1','2','4')?@IvanLibedinsky-是的,现在编辑。如果元组的长度不能被3整除怎么办?假设我们只有两个元素,那么这两个元素必须添加到另一个元组中[(25,11),(10,11),(5,6)],谢谢,但问题是列表是动态的。我可能需要根据第一个元组的大小将其拆分为最大值6。如果在a中为x使用
c=[x[3:6]
,那么它只会到达第6个元素,这是您想要的吗?你能更确切地说明你想在这个问题上做什么吗?我的清单是动态的。它可以是这样的a=[(7,6,8,19,2,4,13,1,10,25,11,34),(1,2,3,4,5,6,7,8,9,10,11,12),(3,5,6,7,89,0,1,3,4,5,6,7)]或a=[(7,6),(1,2),(3,5)]。如果列表中的第一个元组超过三个,那么我想将列表拆分为多个列表,然后您可以使用and If语句,我将更新我的答案。您还应该编辑您的问题以明确这一点。编辑了问题。将列表拆分为多个列表的方法很好,但当
len(a[0])
不能被3整除时,它将抛出索引越界错误。感谢@DiegoPalacios的帮助,在第二段代码中修复了该问题
def split_by(lst, size=3):
  return [[t[ind:ind+size] for t in a] for ind in range(0, min(map(len, a)), size)]

print(split_by(a))
[   [('Index', 'col1', 'col2'), ('1', '2', '4'), ('3', '6', '8')],    
    [('col3', 'col4', 'col5'), ('6', '78', '9'), ('9', '2', '1')]]