Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在条件下返回键_Python_Dictionary_Set - Fatal编程技术网

Python 在条件下返回键

Python 在条件下返回键,python,dictionary,set,Python,Dictionary,Set,我有一个字典,其中的值是非唯一值的列表,并与各种键关联 mydict = {120: ["foo", "bar", "cat"], 125: ["dog", "foo", "bar"]} 我在字典里有一组值 myset = set(['foo', 'bar', 'cat', 'dog']) 我只想为字典中的每个值返回并打印一个键,条件是该键是字典中该值对应的最大数字。为了澄清我的意思,这是我想要实现的结果: 120: "cat" 125: "dog" 125: 'foo' 125: 'bar

我有一个字典,其中的值是非唯一值的列表,并与各种键关联

mydict = {120: ["foo", "bar", "cat"], 125: ["dog", "foo", "bar"]}
我在字典里有一组值

myset = set(['foo', 'bar', 'cat', 'dog'])
我只想为字典中的每个值返回并打印一个键,条件是该键是字典中该值对应的最大数字。为了澄清我的意思,这是我想要实现的结果:

120: "cat"
125: "dog"
125: 'foo'
125: 'bar'
因此,每个值只打印一次,并且只打印对应的最大值。我已经能够将集合中的每个值与键一起打印,但不知道如何构建条件方面:

result = ''
for i in set:
    result += "%s\t%s" % (i, [key for key in dict if i in dict[key]])
试试这个:

from itertools import chain

mydict = {120: ['foo', 'bar', 'cat'], 125: ['dog', 'foo', 'bar']}
values = set(chain(* [v for k, v in mydict.items()]))
# values == {'bar', 'cat', 'dog', 'foo'}

for v in values:
    m = 0
    for k, vl in mydict.items():
        if v in vl and k > m:
            m = k
    print(v + " " + str(m))
输出:

dog 125
bar 125
cat 120
foo 125

我认为这是一个更清晰、更方便的解决方案

out = {}

for value in myset:
    out[val] = max([key for key, values in mydict.iteritems() if value in values])
输出:

{'bar': 125, 'cat': 120, 'dog': 125, 'foo': 125}
输出为:

125: foo
125: bar
125: dog
120: cat

您不需要构建中间集,您可以在
dict
上构建一个生成器,然后对项进行排序,并利用键/值对的最后一个元素将是最高的键条目这一事实,将其传递给
dict
构造函数,例如:

mydict = {120: ["foo", "bar", "cat"], 125: ["dog", "foo", "bar"]}
result = dict(sorted(((v, k) for k in mydict for v in mydict[k])))
# {'foo': 125, 'bar': 125, 'dog': 125, 'cat': 120}
然后根据需要输出
结果


如果确实希望筛选某些键值,则可以使用:

required = {'cat', 'foo'}
result = dict(sorted(((v, k) for k in mydict for v in mydict[k] if v in required)))
# {'foo': 125, 'cat': 120}
最有效的解决方案是首先收集每个唯一值的最大密钥;您可以预先对集合进行筛选,也可以对其他集合重新使用生成的映射

这是一个O(N)(线性时间)解,其中N是字典中值的总数。预过滤将它降低到下面,因为您只考虑集合中的值。与使用排序的进行比较;一种O(NlogN)算法

设置关键点的后期选择如下所示:

max_key = {}
for key, values in mydict.iteritems():
    for value in values:
        if key > max_key.get(value, float('-inf')):
            max_key[value] = key

result = {val: max_key[val] for val in myset}
现在,您可以使用
max_键
映射为任何集合生成结果

预过滤看起来像

max_key = {}
for key, values in mydict.iteritems():
    for value in myset.intersection(values):
        if key > max_key.get(value, float('-inf')):
            max_key[value] = key

result = {key: val for val, key in max_key.iteritems()}

但是您必须为每一组新值重新运行整个算法。

您使用的
dict
语法错误。只需执行
mydict={120:[“foo”,“bar”,“cat”],125:[“dog”,“foo”,“bar”}
。使用
max([key for key in dict if i in dict[key]])
获得最大的键?有效。谢谢-我真不敢相信它这么简单。@OakAnder114注意:如果
[key for key in dict if I in dict[key]]
返回一个空列表,就会出现异常。
*
在定义集合时的函数是什么?@OakAnder114在调用类似于
*
的函数时会解压下面的列表。因此
foo(a,b,c)
foo(*[a,b,c])
注意,您可以只使用:
set().union(*mydict.values())
而不是
chain
在那里(我假设您的意思是
values
,而不是
max_key = {}
for key, values in mydict.iteritems():
    for value in myset.intersection(values):
        if key > max_key.get(value, float('-inf')):
            max_key[value] = key

result = {key: val for val, key in max_key.iteritems()}