Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从元组列表中获取元组的前几个元素_Python_Python 3.x - Fatal编程技术网

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

Python 从元组列表中获取元组的前几个元素,python,python-3.x,Python,Python 3.x,我有一个元组列表的结构,如:- [[(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个元组列表。一个元组用于前两列,另一个元组用于第三列。 期望输出:- [[(1, 1), (1, 2), (0, 5), (0, 6)], [(2, 1), (1, 2), (10, 3

我有一个元组列表的结构,如:-

[[(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个元组列表。一个元组用于前两列,另一个元组用于第三列。 期望输出:-

[[(1, 1),
  (1, 2),
  (0, 5),
  (0, 6)],
 [(2, 1),
  (1, 2),
  (10, 3),
  (2, 4)]]
&&

如何在python中实现这一点

[[(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,)]]
针对评论:

def slice_nested_array(arr, start, stop=None, step=1):
    if stop is None:
        stop = len(arr[0][0])
    return [[tuple(l[start:stop:step]) for l in r] for r in arr]

slice_nested_array(arr, 0, 2)
# => [[(1, 1), (1, 2), (0, 5), (0, 6)], [(2, 1), (1, 2), (10, 3), (2, 4)]]
slice_nested_array(arr, 2)
# => [[(96,), (95,), (23,), (22,)], [(145,), (144,), (143,), (142,)]]
针对评论:

def slice_nested_array(arr, start, stop=None, step=1):
    if stop is None:
        stop = len(arr[0][0])
    return [[tuple(l[start:stop:step]) for l in r] for r in arr]

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

只需保持简单,循环嵌套列表,并获取所需内容:

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,)]
或使用列表理解:

first = [tup[:-1] for l in lst for tup in l]
second = [(tup[-1],) for l in lst for tup in l]
然后将这些列表分别转换为2个子列表:

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,)]]

只需保持简单,循环嵌套列表,并获取所需内容:

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,)]
或使用列表理解:

first = [tup[:-1] for l in lst for tup in l]
second = [(tup[-1],) for l in lst for tup in l]
然后将这些列表分别转换为2个子列表:

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)
用法如下:

hist_oneshot,hist_scalar = fn(hist,[0,1],[2])

尽管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)
用法如下:

hist_oneshot,hist_scalar = fn(hist,[0,1],[2])

(96)
(相当于
96
,一个整数)或
(96,)
(一元组)?(96,)相当于一元组。
(96)
不等同于一元组
(96)
只是括号中的一个整数,相当于
(95+1)
(96,)
是一个1元组。参见:
(96)+(1)
97
<代码>(96,)+(1,)是
(96,1)
。感谢您指出这一点。我已经更新了问题和我的评论。
(96)
(相当于
96
,一个整数)或
(96,)
(一个元组)?(96,)相当于一个元组。
(96)
不等同于一个元组
(96)
只是括号中的一个整数,相当于
(95+1)
(96,)
是一个1元组。参见:
(96)+(1)
97
<代码>(96,)+(1,)是
(96,1)
。感谢您指出这一点。我已经更新了问题和我的评论。这很有效!此外,还有一种方法可以编写某种类型的泛型函数,该函数接受输出中的列值。比如:-def get_first_x_columns(arr,columns),这里列的值是(0,1)。不确定您的意思,您应该展示一个如何使用该函数的示例。基本上,如果我添加其他列,那么您答案中的以下命令将变成:-[[(c,d)表示a,b,c,*d in r]表示r in arr]。所以,我希望它是可配置的,这样每次添加一个新列时,就可以避免这种情况。在函数中,我可以为前两列传递[arr,(0,1)],为下两列传递[arr,(2,3)]。这非常有效!此外,还有一种方法可以编写某种类型的泛型函数,该函数接受输出中的列值。比如:-def get_first_x_columns(arr,columns),这里列的值是(0,1)。不确定您的意思,您应该展示一个如何使用该函数的示例。基本上,如果我添加其他列,那么您答案中的以下命令将变成:-[[(c,d)表示a,b,c,*d in r]表示r in arr]。所以,我希望它是可配置的,这样每次添加一个新列时,就可以避免这种情况。如中所示,在函数中,我可以为前2列传递[arr,(0,1)],为下2列传递[arr,(2,3)]。