条件下返回键

时间:2014-10-15 06:16:09

标签: python dictionary set

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

mydict = {120: ["foo", "bar", "cat"], 125: ["dog", "foo", "bar"]}

我在字典中有一组值

myset = set(['foo', 'bar', 'cat', 'dog'])

我想返回并仅打印字典中每个值的1个键,条件是该键是字典中值对应的最大数字。为了澄清我的意思,这是我想要实现的结果:

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]])

5 个答案:

答案 0 :(得分:1)

您不需要构建中间集,您可以在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}

然后根据需要输出result值。


如果您确实希望过滤某些键值,则可以使用:

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}

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

我认为更清晰方便的解决方案。

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}

答案 3 :(得分:0)

if __name__ == "__main__":
    mydict = {120: ["foo", "bar", "cat"], 125: ["dog", "foo", "bar"]}

    tempdict = {}
    for key, value in mydict.items():
        for item in value:
            tempdict[item] = key

    myset = set(['foo', 'bar', 'cat', 'dog'])
    for item in myset:
        if item in tempdict.keys():
           print "%d: %s" % (tempdict[item], item)

输出是:

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

答案 4 :(得分:0)

高效的解决方案是首先收集每个唯一值的最大密钥;您可以事先对您的集合进行过滤,也可以将结果映射重新用于其他集合。

这是一个O(N)(线性时间)解决方案,其中N是字典中值的数。预过滤会将其降低到低于该值,因为您只考虑集合中的值。将其与使用排序的Jon's answer进行比较; 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_key映射为任何集合生成结果。

预过滤看起来像

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()}

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