从元组列表中获取元组的前几个元素

2024-04-20 13:22:20 发布

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

我有一个元组列表的结构比如:在

[[(1, 1, 96),
  (1, 2, 95),
  (0, 5, 23),
  (0, 6, 22)],
 [(2, 1, 145),
  (1, 2, 144),
  (10, 3, 143),
  (2, 4, 142)]]

我基本上想从这里得到2个元组列表。一个元组用于前两列,另一个元组用于第三列。 渴望的输出:-在

^{pr2}$

&

[[(96,),
  (95,),
  (23,),
  (22,)],
 [(145,),
  (144,),
  (143,),
  (142,)]]

在python中如何做到这一点?在


Tags: 列表结构amp元组pr2
3条回答

只要保持简单,在嵌套列表上循环,然后获取所需的内容:

lst = [[(1, 1, 96),
        (1, 2, 95),
        (0, 5, 23),
        (0, 6, 22)],
       [(2, 1, 145),
        (1, 2, 144),
        (10, 3, 143),
        (2, 4, 142)]]

first = []
second = []

for l in lst:
    for tup in l:
        first.append(tup[:-1])
        second.append((tup[-1],))

print(first)
# [(1, 1), (1, 2), (0, 5), (0, 6), (2, 1), (1, 2), (10, 3), (2, 4)]
print(second)
# [(96,), (95,), (23,), (22,), (145,), (144,), (143,), (142,)]

或者用列表理解:

^{pr2}$

然后将这些列表分成两个子列表:

sublen = len(lst[0])

def split_lists(l, s):
    return [l[i:i+s] for i in range(0, len(l), s)]

print(split_lists(first, sublen))
# [[(1, 1), (1, 2), (0, 5), (0, 6)], [(2, 1), (1, 2), (10, 3), (2, 4)]]

print(split_lists(second, sublen))
# [[(96,), (95,), (23,), (22,)], [(145,), (144,), (143,), (142,)]]

尽管Amadan的回答很好,但我还是想编写一个通用函数来实现期望的结果。这是决赛代码:-

def fn(data, one_shot_columns, scalar_columns):
     zipped=list(zip(*data)) 
     one_shot_zipped=[zipped[i] for i in one_shot_columns] 
     one_shot=list(zip(*one_shot_zipped)) 
     scalar_zipped=[zipped[i] for i in scalar_columns] 
     scalar=list(zip(*scalar_zipped)) 
     return (one_shot,scalar)

使用比如:在

^{pr2}$
[[(a, b) for a, b, *c in r] for r in arr]
# => [[(1, 1), (1, 2), (0, 5), (0, 6)], [(2, 1), (1, 2), (10, 3), (2, 4)]]

[[tuple(c) for a, b, *c in r] for r in arr]
# => [[(96,), (95,), (23,), (22,)], [(145,), (144,), (143,), (142,)]]

针对评论:

^{pr2}$

相关问题 更多 >