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来决定。