Python 重新格式化列表中的列表
Python list in list reformatting
重组我的以下数据的 pythonic 方法是什么?
我有一个数据
data = [
['a','b',1], ['a','b',2], ['a','b',3],
['a','c',3], ['a','c',4],
['f','g',2], ['f','g',5], ['f','g',9]
]
我想将其重新排列为以下格式:
data = [
['a', 'b', 1, 2, 3],
['a', 'c', 3, 4],
['f', 'g', 2, 5, 9]
]
所以基本上每个内部列表中的前两个元素是区分不同项目的方式,后面的数字是数据。我只想让包含所有数据的每个项目一行。
您可以使用字典根据每个子列表中的前两项对项目进行分类,然后使用列表理解来连接字典的键和值:
请注意,使用 OrderedDict
的原因是它会为您保留顺序。
>>> from collections import OrderedDict
>>> d = OrderedDict()
>>>
>>> for i, j, k in data:
... d.setdefault((i, j), []).append(k)
...
>>> [[i,j] + k for (i,j), k in d.items()]
[['a', 'b', 1, 2, 3], ['a', 'c', 3, 4], ['f', 'g', 2, 5, 9]]
如果您正在处理大型列表并且关心内存优化,您可以使用 itertools
模块中的 groupby
和 chain
函数,即 return 迭代器:
>>> from itertools import groupby, chain
>>> from operator import itemgetter
>>> from collections import OrderedDict
>>> [OrderedDict.fromkeys(chain.from_iterable(g)).keys() for _,g in groupby(data, key=itemgetter(0, 1))]
[['a', 'b', 1, 2, 3], ['a', 'c', 3, 4], ['f', 'g', 2, 5, 9]]
import collections
keyed = collections.defaultdict(list) # (a,b): [1,2,3]
for k1,k2,val in data:
keyed[(k1,k2)].append(val)
[list(keys) + vals for keys,vals in sorted(keyed.items())]
重组我的以下数据的 pythonic 方法是什么?
我有一个数据
data = [
['a','b',1], ['a','b',2], ['a','b',3],
['a','c',3], ['a','c',4],
['f','g',2], ['f','g',5], ['f','g',9]
]
我想将其重新排列为以下格式:
data = [
['a', 'b', 1, 2, 3],
['a', 'c', 3, 4],
['f', 'g', 2, 5, 9]
]
所以基本上每个内部列表中的前两个元素是区分不同项目的方式,后面的数字是数据。我只想让包含所有数据的每个项目一行。
您可以使用字典根据每个子列表中的前两项对项目进行分类,然后使用列表理解来连接字典的键和值:
请注意,使用 OrderedDict
的原因是它会为您保留顺序。
>>> from collections import OrderedDict
>>> d = OrderedDict()
>>>
>>> for i, j, k in data:
... d.setdefault((i, j), []).append(k)
...
>>> [[i,j] + k for (i,j), k in d.items()]
[['a', 'b', 1, 2, 3], ['a', 'c', 3, 4], ['f', 'g', 2, 5, 9]]
如果您正在处理大型列表并且关心内存优化,您可以使用 itertools
模块中的 groupby
和 chain
函数,即 return 迭代器:
>>> from itertools import groupby, chain
>>> from operator import itemgetter
>>> from collections import OrderedDict
>>> [OrderedDict.fromkeys(chain.from_iterable(g)).keys() for _,g in groupby(data, key=itemgetter(0, 1))]
[['a', 'b', 1, 2, 3], ['a', 'c', 3, 4], ['f', 'g', 2, 5, 9]]
import collections
keyed = collections.defaultdict(list) # (a,b): [1,2,3]
for k1,k2,val in data:
keyed[(k1,k2)].append(val)
[list(keys) + vals for keys,vals in sorted(keyed.items())]