Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Arrays_List_Tuples - Fatal编程技术网

Python 按元素对元组数组进行切片

Python 按元素对元组数组进行切片,python,arrays,list,tuples,Python,Arrays,List,Tuples,例如,我有一个元组数组 l=[(456,33,1), (556,22,1), (123,33,2), (557,32,2), (435,21,2)] 我想按每个元组中的最后一个元素生成列表数组,以便 l=[[(456,33), (556,22)], [(123,33), (557,32), (435,21)]] 我怎么能这么做?有什么优雅的方法吗?l=[(456,33,1)、(556,22,1)、(123,33,2)、(557,32,2)、(43

例如,我有一个元组数组

l=[(456,33,1),
   (556,22,1),
   (123,33,2),
   (557,32,2),
   (435,21,2)]
我想按每个元组中的最后一个元素生成列表数组,以便

l=[[(456,33),
   (556,22)],
  [(123,33),
   (557,32),
   (435,21)]]
我怎么能这么做?有什么优雅的方法吗?

l=[(456,33,1)、(556,22,1)、(123,33,2)、(557,32,2)、(435,21,2)]
out={}
对于l中的v:
out.setdefault(v[-1],).append(v[:-1])
out=list(out.values())
打印(输出)
印刷品:

[(456,33)、(556,22)],
[(123, 33), (557, 32), (435, 21)]]
l=[(456,33,1)、(556,22,1)、(123,33,2)、(557,32,2)、(435,21,2)]
out={}
对于l中的v:
out.setdefault(v[-1],).append(v[:-1])
out=list(out.values())
打印(输出)
印刷品:

[(456,33)、(556,22)],
[(123, 33), (557, 32), (435, 21)]]

另一种尝试是使用以下方法:

l=[(456,33,1),
   (556,22,1),
   (123,33,2),
   (557,32,2),
   (435,21,2)]
   
dict_ = {}
for v in l:
  val1, val2, id_ = v
  dict_[id_] = [[val1, val2]] if id_ not in dict_ else dict_[id_] + [[val1, val2]]
    
l = [dict_[x] for x in dict_]

另一种尝试是使用以下方法:

l=[(456,33,1),
   (556,22,1),
   (123,33,2),
   (557,32,2),
   (435,21,2)]
   
dict_ = {}
for v in l:
  val1, val2, id_ = v
  dict_[id_] = [[val1, val2]] if id_ not in dict_ else dict_[id_] + [[val1, val2]]
    
l = [dict_[x] for x in dict_]

另一种方法是使用
itertools.groupby

from itertools import groupby
from operator import itemgetter

res = [[x[:-1] for x in g] for _, g in groupby(sorted(l, key=itemgetter(2)), itemgetter(2))]
产生所需的:

[[(456, 33), (556, 22)], [(123, 33), (557, 32), (435, 21)]]

请注意,如果可以保证原始列表
l
按元组中的第三项排序,则可以将
排序(l,key=itemgetter(2))
替换为
l

另一种方法是使用
itertools.groupby

from itertools import groupby
from operator import itemgetter

res = [[x[:-1] for x in g] for _, g in groupby(sorted(l, key=itemgetter(2)), itemgetter(2))]
产生所需的:

[[(456, 33), (556, 22)], [(123, 33), (557, 32), (435, 21)]]

请注意,如果可以保证原始列表
l
按元组中的第三项排序,则可以将
排序(l,key=itemgetter(2))
替换为
l

,具体取决于OP使用的python实现及其需要,它们可能会在
out
中的元素出现的顺序上遇到问题(可能与
l
不同步)。否则我觉得这个解决方案非常优雅+1根据OP使用的python实现及其需求,他们可能会遇到
out
中元素出现顺序的问题(可能与
l
不同步)。否则我觉得这个解决方案非常优雅+1假设列表已根据元组的第三个条目进行排序是否安全?假设列表已根据元组的第三个条目进行排序是否安全?另外,请注意,如果您只想迭代结果序列,则无需创建完整列表。在这种情况下,这将减少为
对于key,groupby中的group(l,key=itemgetter(2))
其中
key
将是原始元组的第三个条目,
group
将是所有元组的迭代器,其中
key
作为第三个条目。@Brian sure。不过,我会让OP来决定。还要注意的是,如果您只想对结果序列进行迭代,则无需创建完整的列表列表。在这种情况下,这将减少为
对于key,groupby中的group(l,key=itemgetter(2))
其中
key
将是原始元组的第三个条目,
group
将是所有元组的迭代器,其中
key
作为第三个条目。@Brian sure。不过,我会让OP来决定。