簡體   English   中英

Python 3列表理解和和連接

[英]Python 3 list comprehension sum and concatenation

mylist =[[16, 'August', 2014, 540, 10], [16, 'Iunie', 2014, 100, 20], [23,'August', 2014, 540,10], [23,'Septembrie', 2016, 540,30], [21,'August', 2014, 422, 30]]

我想要實現的是:

manipulate = [[16, 'August 2014, Iunie 2014', 540, 30], [23, 'August 2014, Septembrie 2016', 540, 40], [21, 'August', 2014, 422, 30]]

並解釋一下,在mylist(列表列表)中,我想檢查索引0(第一個元素)的每個列表,當它找到相同的值元素時(在我的例子中16 === 16)並執行以下操作:keep只有第一個列表並累積到索引1 +索引2(如此示例 - >'8月',2014年和'Iunie',2014年到'2014年8月,Iunie 2014')並將索引4加起來(如我的示例中所示20) + 10)。

我設法這樣做:

manipulate=[i for i in mylist if i[0] not in [mylist[idx][0] for idx in range(0,mylist.index(i))]]

但這將輸出:

[[16, 'August', 2014, 540, 10], [23, 'August', 2014, 540, 10], [21, 'August', 2014, 422, 30]]

為了也做我想要的計算,我必須添加什么?,我使用python 3.非常感謝你!

假設列表已經按第一個元素排序,您可以使用itertools.groupby對元素進行分組,然后組合新的子列表。

manipulate = []
for group in (list(g) for k, g in itertools.groupby(mylist, key=lambda x: x[0])):
    lst = [group[0][0]] + [x for g in group for x in g[1:3]] + [group[0][3]] + [sum(g[-1] for g in group)]
    manipulate.append(lst)

如果你想要的話,你甚至可以把它們放在一個可怕的列表中...

manipulate = [[group[0][0]] + [x for g in group for x in g[1:3]] + [group[0][3]] + [sum(g[-1] for g in group)]
              for group in (list(g) for k, g in itertools.groupby(mylist, key=lambda x: x[0]))]

結果就是這個(我不合並字符串,因為我不確定你真的是這個意思):

[[16, 'August', 2014, 'Iunie', 2014, 540, 30], 
 [23, 'August', 2014, 'Septembrie', 2016, 540, 40], 
 [21, 'August', 2014, 422, 30]]

如果你想合並日期,請使用這個稍微更糟糕的列表理解:

manipulate = [[group[0][0]] + [', '.join(' '.join(map(str, g[1:3])) for g in group)] + [group[0][3]] + [sum(g[-1] for g in group)]
              for group in (list(g) for k, g in itertools.groupby(mylist, key=lambda x: x[0]))]

這樣,結果是:

[[16, 'August 2014, Iunie 2014', 540, 30], 
 [23, 'August 2014, Septembrie 2016', 540, 40], 
 [21, 'August 2014', 422, 30]]

這適用於每組任意數量的元素。 如果子列表未按第一個元素排序,則首先對它們進行排序,或使用字典進行分組。

這是非常冗長但我覺得它必須是, 可理解\\可讀

mylist = [[16, 'August', 2014, 540, 10], [16, 'Iunie', 2014, 100, 20], [23, 'August', 2014, 540, 10], [23, 'Septembrie', 2016, 540, 30], [21, 'August', 2014, 422, 30]]

g = {}
for x, *y in mylist:
    g.setdefault(x, []).append(y)

def formater(obj, a_list):
    if len(a_list) == 1:
        return [obj] + a_list[0]
    else:
        conc = ', '.join('{} {}'.format(sub[0], sub[1]) for sub in a_list)
        return [obj, conc, a_list[0][2], sum(sub[3] for sub in a_list)]

manipulate = [formater(k, v) for k, v in g.items()]
print(manipulate)  # [[16, 'August 2014, Iunie 2014', 540, 30], [21, 'August', 2014, 422, 30], [23, 'August 2014, Septembrie 2016', 540, 40]]

你可以試試這個:

mylist =[[16, 'August', 2014, 540, 10], [16, 'Iunie', 2014, 100, 20], [23,'August', 2014, 540,10], [23,'Septembrie', 2016, 540,30], [21,'August', 2014, 422, 30]]

new_list = [[mylist[i][0]]+[mylist[i][1]+" "+str(mylist[i][2])]+mylist[i][3:] for i in range(len(mylist))]

final_lists = [[c+", "+d if isinstance(c, str) and isinstance(d, str)  else c+d if c != d else c for c, d in zip(new_list[i], new_list[i+1])] for i in range(0, len(new_list)-1, 2)]+mylist[-1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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