簡體   English   中英

如何基於每個子列表中的公用密鑰創建新的子列表層,以便對子列表進行分類?

[英]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的參數必須是可調用的。 您可以使用lambdafunctools.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM