我需要有关如何删除字典元组中重复项的帮助。
dict of {tuple of (str, str, str, str): int}) -> tuple of (str, None)
这是字典:
{('ALPHA', 'BETA', 'GAMMA', 'DELTA'): 5
('BETA', 'GAMMA', 'ALPHA', 'DELTA'): 3
('DELTA', 'BETA', 'GAMMA', 'ALPHA'): 1
('GAMMA', 'DELTA', 'ALPHA', 'BETA'): 3
('BETA', 'ALPHA', 'DELTA', 'GAMMA'): 4}
,整数是tuple
的第一个索引的值,这样我就可以将它们分组:
def rad_type(particle):
my_dict = {}
for (k, v) in particle.items():
if (k[0] in my_dict):
my_dict[k[0]] += v
else:
my_dict[k[0]] = v
return my_dict
返回:
{'ALPHA': 5, 'BETA': 7, 'GAMMA': 3, 'DELTA': 1}
由于'DELTA'
的值最小,在本例中为1,但我想删除这样的元素:
{('ALPHA', 'BETA', 'GAMMA'): 5
('BETA', 'GAMMA', 'ALPHA'): 7
('BETA', 'GAMMA', 'ALPHA'): 1
('GAMMA', 'ALPHA', 'BETA'): 3}
这给出了ALPHA = 5, BETA = 8, GAMMA = 3
;这就是我在字典方面真正需要的东西。
我试图移除最少的元素但它不起作用?
for (p, v) in my_dict.items():
if (max(my_dict.values()) / sum(my_dict.values()):
if (v == min(my_dict.values())):
del my_dict[p]
return my_dict
但是这会给ALPHA = 5, BETA = 7, GAMMA = 3
由于这会返回一个字典,如何删除带有tuple
的重复项并将其作为字典返回,而不用导入任何内容?
问题类似于this。
答案 0 :(得分:1)
这是一个建议..
如果我们使用你的功能:
def rad_type(particle):
my_dict = {}
for (k, v) in particle.items():
if (k[0] in my_dict):
my_dict[k[0]] += v
else:
my_dict[k[0]] = v
return my_dict
如果我们定义另一个使用你的函数的函数:
def filter(dict):
filter1 = rad_type(dict)
i = 0
for k ,val in dict.items():
dict[k] = filter1[k[0]]
i +=1
mini_key = [k for k , val in filter1.items() if val == min([value for key , value in filter1.items()])][0]
filter2 = {tuple(y for y in key if y != mini_key):value for key, value in dict.items()}
filter3 = rad_type(filter2)
return filter3
如果我们在字典粒子上应用这个函数:
result = filter(particle)
输出是:
{'ALPHA': 5, 'BETA': 8, 'GAMMA': 3}
答案 1 :(得分:0)
你需要某种Counter
。我使用Collections.Counter
实现了一个解决方案,但是如果你不能直接导入Counter,你必须自己实现它。或者,Collections.Counter
是纯python,您可以将Counter
的源代码复制到您自己的解决方案中,以避免导入它。
def display_results(data):
''' Displays the sum of the first entries in a tuple in a given dictionary
>>> display_results(data)
... {'ALPHA': 5, 'BETA': 7, 'GAMMA': 3, 'DELTA': 1}'''
data = Counter(data)
count = Counter()
for i in data:
count[i[0]] += data[i]
return count
def process_data(data):
''' Generates a new Counter object with the contents of data, minus the least common
object in the first tuple as defined by display_results().
>>> data = process_data(data)
>>> display_results(data)
{'ALPHA' : 5, 'BETA' : 7, 'GAMMA' : 3} '''
data = Counter(data)
count = Counter()
least_common = display_results(data).most_common()[-1][0]
for i in data:
j = list(i)
j.remove(least_common)
count[tuple(j)] += data[i]
return count