use*_*225 2 python dictionary python-3.x
我有2个字典:每个字典中的值都应该相等.
但我不知道这个数字是多少......
dict1 = {'xx':A, 'yy':A, 'zz':A}
dict2 = {'xx':B, 'yy':B, 'zz':B}
Run Code Online (Sandbox Code Playgroud)
NB A不等于B
N.B. A和B实际上都是十进制数字的字符串(例如'-2.304998'),因为它们是从文本文件中提取的
我想创建另一个字典 - 有效地总结这些数据 - 但前提是每个字典中的所有值都相同.
即
summary = {}
if dict1['xx'] == dict1['yy'] == dict1['zz']:
summary['s'] = dict1['xx']
if dict2['xx'] == dict2['yy'] == dict2['zz']:
summary['hf'] = dict2['xx']
Run Code Online (Sandbox Code Playgroud)
有一种巧妙的方式在一行中这样做吗?
我知道可以使用理解创建一个字典,
summary = {k:v for (k,v) in zip(iterable1, iterable2)}
但我正在努力与底层for循环和if语句...
一些建议将不胜感激.
我已经看到了这个问题,但答案似乎都依赖于已经知道正在测试的值(即字典中的所有条目都等于已知数字) - 除非我遗漏了一些东西.
sets是一个可靠的方式去这里,但只是为了代码高尔夫目的这里是一个可以处理不可清除的dict值的版本:
expected_value = next(iter(dict1.values())) # check for an empty dictionary first if that's possible
all_equal = all(value == expected_value for value in dict1.values())
Run Code Online (Sandbox Code Playgroud)
all在不匹配的早期终止,但是设置的构造函数已经足够优化,在没有对真实测试数据进行分析的情况下我不会说这很重要.处理不可清除的值是此版本的主要优点.
一种方法是利用set. set如果其中只有一个值,则您知道可迭代对象的 a 的长度为 1:
if len(set(dct.values())) == 1:
summary[k] = next(iter(dct.values()))
Run Code Online (Sandbox Code Playgroud)
当然,这仅在您的字典的值是可散列的情况下才有效。
虽然我们可以使用set它,但是当输入很大时,这样做会产生许多低效率.它可以占用与输入大小成比例的存储器,并且它总是扫描整个输入,即使在早期发现两个不同的值时也是如此.此外,输入必须是可清除的.
对于3键词,这并不重要,但对于较大的词,而不是使用set,我们可以使用itertools.groupby并查看它是否产生多个组:
import itertools
groups = itertools.groupby(dict1.values())
# Consume one group if there is one, then see if there's another.
next(groups, None)
if next(groups, None) is None:
# All values are equal.
do_something()
else:
# Unequal values detected.
do_something_else()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2628 次 |
| 最近记录: |