[英]How to create a new layer of sublists based on a common key within each sublist in order to categorize the sublists?
如何基於每個子列表中的公用密鑰創建新的子列表層,以便對子列表進行分類? 換句話說,如何將子列表放入列表中索引1的每個項目都相同的新子列表中?
例如,我想將下面的子列表列表變成子列表列表,其中每個子列表都在一個新的子列表中,其中索引1處的每個項目在該子列表中都相同。 我想將該列表中的蘋果,香蕉和橙子列表放入新的子列表中。
lsta = [['2014W01','apple',21,'apple@gmail.com'],['2014W02','apple',19,'apple@g.com'],['2014W02','banana',51,'b@gmail.com'],['2014W03','apple',100,'apple@gmail.com'],['2014W01','banana',71,'b@yahoo.com'],['2014W02','organge',21,'organge@gmail.com']]
我希望將蘋果的三個子列表包含在一個新的子列表中,並將香蕉的兩個子列表包含在一個新的子列表中,等等。
Desired_List = [[['2014W01','apple',21,'apple@gmail.com'],['2014W02','apple',19,'apple@g.com'],['2014W03','apple',100,'apple@gmail.com']],[['2014W02','banana',51,'b@gmail.com'],['2014W01','banana',71,'b@yahoo.com']],[['2014W02','organge',21,'organge@gmail.com']]]
獎勵積分,如果您能告訴我如何進行多種分類(例如,不僅按水果類型分類,還按周分類)?
In [43]: import itertools as IT
In [44]: import operator
In [46]: [list(grp) for key, grp in IT.groupby(sorted(lsta, key=operator.itemgetter(1)), key=operator.itemgetter(1))]
Out[46]:
[[['2014W01', 'apple', 21, 'apple@gmail.com'],
['2014W02', 'apple', 19, 'apple@g.com'],
['2014W03', 'apple', 100, 'apple@gmail.com']],
[['2014W02', 'banana', 51, 'b@gmail.com'],
['2014W01', 'banana', 71, 'b@yahoo.com']],
[['2014W02', 'organge', 21, 'organge@gmail.com']]]
通常,我會在上面使用itertools.groupby
,但這只是為了好玩,這是一種手動完成所有繁重工作的方法
def transform(lista):
d = {}
for subl in lista:
k = subl.pop(1)
if k not in d:
d[k] = []
d[k].append(subl)
answer = []
for k, lists in d.items():
temp = []
for l in lists:
l.insert(1, k)
temp.append(l)
answer.append(temp)
return answer
輸出:
In [56]: transform(lsta)
Out[56]:
[[['2014W02', 'organge', 21, 'organge@gmail.com']],
[['2014W01', 'apple', 21, 'apple@gmail.com'],
['2014W02', 'apple', 19, 'apple@g.com'],
['2014W03', 'apple', 100, 'apple@gmail.com']],
[['2014W02', 'banana', 51, 'b@gmail.com'],
['2014W01', 'banana', 71, 'b@yahoo.com']]]
我會采取一些不同的策略。 您可能希望您的group-by字段成為dict
的查找值。 該值可以只是各種list
..無論您要在此處調用每個子列表。 我將每個人稱為FruitPerson
。
from collections import defaultdict, namedtuple
FruitPerson = namedtuple('FruitPerson','id age email')
d = defaultdict(list)
for sublist in lsta:
d[sublist[1]].append(FruitPerson(sublist[0],*sublist[2:]))
然后,例如:
d['apple']
Out[19]:
[FruitPerson(id='2014W01', age=21, email='apple@gmail.com'),
FruitPerson(id='2014W02', age=19, email='apple@g.com'),
FruitPerson(id='2014W03', age=100, email='apple@gmail.com')]
d['apple'][0]
Out[20]: FruitPerson(id='2014W01', age=21, email='apple@gmail.com')
d['apple'][0].id
Out[21]: '2014W01'
編輯:好的,多分類獎勵點問題。 您只需要嵌套字典即可。 語法有點愚蠢,因為defaultdict
的參數必須是可調用的。 您可以使用lambda
或functools.partial
:
FruitPerson = namedtuple('FruitPerson','age email') #just removed 'id' field
d = defaultdict(lambda: defaultdict(list))
for sublist in lsta:
d[sublist[1]][sublist[0]].append(FruitPerson(*sublist[2:]))
d['apple']
Out[37]: defaultdict(<type 'list'>, {'2014W03': [FruitPerson(age=100, email='apple@gmail.com')], '2014W02': [FruitPerson(age=19, email='apple@g.com')], '2014W01': [FruitPerson(age=21, email='apple@gmail.com')]})
d['apple']['2014W01']
Out[38]: [FruitPerson(age=21, email='apple@gmail.com')]
d['apple']['2014W01'][0].email
Out[40]: 'apple@gmail.com'
盡管坦白地說,您應該考慮升級到一個真正的關系數據庫,該數據庫可以理解SELECT whatever FROM whatever WHERE something
類型的查詢中SELECT whatever FROM whatever WHERE something
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.