[英]Remove tuples within a list of tuples based on dictionary value within the tuple
[英]Remove tuples from dictionary value list if first value in tuple = 1
首先,我有一個字典d1,看起來像這樣:
d1 = { 'w' : ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
'x' : ['d', 'd', 'd', 'e', 'e'],
'y' : ['f', 'f', 'g'],
'z' : ['h', 'i']
}
然后,我遍歷該字典並制作一個新字典,其中每個值都是一個包含兩個元素的列表:整數和列表。 整數是d1中該值中的字符串數。 該列表包含元組,每個元組都包含一個來自d1的字符串(在元組的位置1)和該字符串在d1中出現的次數(在元組的位置0):
d2 = { 'w' : [10, [(5, 'a'), (3, 'b'), (2, 'c')],
'x' : [5, [(3, 'd'), (2, 'e')],
'y' : [3, [(2, 'f'), (1, 'g')],
'z' : [2, [(1, 'h'), (1, 'i')]
}
我想刪除僅出現一次的任何字符串(“ g”,“ h”和“ i”),所以最后我想要:
dFinal = { 'w' : [10, [(5, 'a'), (3, 'b'), (2, 'c')],
'x' : [5, [(3, 'd'), (2, 'e')],
'y' : [2, [(2, 'f')]
}
我讀了一個我認為是字典理解的示例,如果值列表的長度小於2,則會刪除整個字典項:
d = {k:v for k,v in d.items() if len(v) > 1}
我試圖了解列表/字典的理解,並希望使用類似的方法來實現我所描述的內容,並從中學習一些東西。
最初,我嘗試編寫一個以d2作為參數的函數,但我不知道如何引用每個元組的位置0。
然后認為,使用不帶元組的d1來制作dFinal可能要容易得多,而不是嘗試更改d2。
如果您能描述一種從d1 和/或 d2制作dFinal的干凈方法,並解釋其思考過程,我將不勝感激。 兩者都將真正幫助我理解如何准確理解字典列表。
謝謝!
好了,您可以使用Counter
對象。 老實說,我會使用循環,因為它可能會更有效率。
In [1]: from collections import Counter
編輯 :這是我實際上將如何執行此操作, 而無需理會:
In [17]: for k,v in d1.items():
...: counts = Counter(v)
...: counts = [t for t in counts.items() if t[1] > 1]
...: if len(counts) > 0:
...: dfinal[k] = [sum(c[1] for c in counts), counts]
...:
In [18]: dfinal
Out[18]:
{'w': [10, [('b', 3), ('a', 5), ('c', 2)]],
'x': [5, [('d', 3), ('e', 2)]],
'y': [2, [('f', 2)]]}
我認為這不是很好的樣式,但是您可以這樣做:
dFinal = {k: [sum([i for i, c in v[1] if i != 1]),
[(i, c) for i, c in v[1] if i != 1]]
for k, v in d2.items()
if [(i, c) for i, c in v[1] if i != 1]}
編輯:現在更新計數。 同樣,如果理解看起來像這樣,那么該重構了。
這個
from collections import Counter
d2 = {k: [len(v), sorted(Counter(v).items())] for k, v in d1.items()}
dFinal = {k: [v1, [(y, x) for x, y in v2 if y > 1]] for k, (v1, v2) in d2.items()}
我的d2
和dFinal
與您的略有不同。 這是我的d2
{'w': [10, [('a', 5), ('b', 3), ('c', 2)]],
'x': [5, [('d', 3), ('e', 2)]],
'y': [3, [('f', 2), ('g', 1)]],
'z': [2, [('h', 1), ('i', 1)]]}
這是我的dFinal
{'w': [10, [(5, 'a'), (3, 'b'), (2, 'c')]],
'x': [5, [(3, 'd'), (2, 'e')]],
'y': [3, [(2, 'f')]],
'z': [2, []]}
但您可以輕松地自行解決。
順便說一句:我將使用函數使字典和列表理解看起來更容易。 現在,它是不可讀的。
另一種選擇:速度較慢但易於遵循:
def has_dupe(lst):
return any([x[0] > 1 for x in lst[1]])
def reduce_list(lst):
result = [(x, y) for (x, y) in lst[1] if x > 1]
return [sum([x for (x, y) in result]), result]
d = {key: reduce_list(value) for key, value in d2.items() if has_dupe(value)}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.