Python 在dict中查找满足特定标准的值

Python 在dict中查找满足特定标准的值,python,dictionary,Python,Dictionary,如果我有如下的口述: d = {"1,2" : 3, "1,3" : 6, "1,4" : 5, "2,3" : 5, "2,4" : 6, "3,4" : 9,} 我试图找到所有符合此标准的三胞胎: d["a,b"] < d["a,c"] == d["b,c"] d[“a,b”]

如果我有如下的口述:

d = {"1,2" : 3, "1,3" : 6, "1,4" : 5,
          "2,3" : 5, "2,4" : 6,
          "3,4" : 9,}
我试图找到所有符合此标准的三胞胎:

d["a,b"] < d["a,c"] == d["b,c"]
d[“a,b”]
棘手的部分是a、b和c可以混洗,直到满足标准。 有没有一个简单的方法可以做到这一点

d = {"1,2" : 3, "1,3" : 6, "1,4" : 5,
          "2,3" : 5, "2,4" : 6,
          "3,4" : 9,}
import itertools
for item in itertools.combinations(d.keys(), 3):
    if d[item[0]] < d[item[1]] == d[item[2]]:
        print d[item[0]], d[item[1]], d[item[2]]
使用列表理解:

import itertools
print [(d[item[0]], d[item[1]], d[item[2]])
        for item in itertools.combinations(d.keys(), 3)
        if d[item[0]] < d[item[1]] == d[item[2]]]
使用列表理解:

import itertools
print [(d[item[0]], d[item[1]], d[item[2]])
        for item in itertools.combinations(d.keys(), 3)
        if d[item[0]] < d[item[1]] == d[item[2]]]

这应该符合OP的要求,但可能不是他们需要的。编辑:现在只有一个循环

d={“1,2”:3,“1,3”:6,“1,4”:5,
"2,3" : 5, "2,4" : 6,
"3,4" : 9,
“a,b”:1,“a,c”:2,“b,c”:2
}
parts=set(“,”.join(d.keys()).split(“,”)#获取键的所有部分
进口itertools
对于itertools中的a、b、c。排列(第3部分):
#得到a,b,c的每个可能排列
尝试:
#尝试查找与条件匹配的项目
如果d[“,”.join([a,b])]

问题是这不会返回任何结果,因为没有匹配该条件的三元组。我添加了一组额外的键,以提供字面上的
('a','b','c')
输出,以显示它的工作原理。

这应该符合OP的要求,但可能不是他们需要的。编辑:现在只有一个循环

d={“1,2”:3,“1,3”:6,“1,4”:5,
"2,3" : 5, "2,4" : 6,
"3,4" : 9,
“a,b”:1,“a,c”:2,“b,c”:2
}
parts=set(“,”.join(d.keys()).split(“,”)#获取键的所有部分
进口itertools
对于itertools中的a、b、c。排列(第3部分):
#得到a,b,c的每个可能排列
尝试:
#尝试查找与条件匹配的项目
如果d[“,”.join([a,b])]


问题是这不会返回任何结果,因为没有匹配该条件的三元组。我添加了一组额外的键,以提供字面上的
('a','b','c')
输出,以显示它的工作原理。

你能解释一下标准吗?另外,你能不能让键元组代替字符串,例如
(1,2)
而不是
“1,2”
x
在Python中的意思是
x
-查找“链式比较”。@TimPeters的观点很好,有个大脑屁。删除。我仍然认为这是一个奇怪的比较。你能解释一下标准吗?另外,你能把键做成元组而不是字符串吗,例如
(1,2)
而不是
“1,2”
?@legostromtroopr,
x
在Python中的意思是
x
-查找“链式比较”。@TimPeters很好,我有个脑屁。删除。我仍然认为这是一个奇怪的比较。我不认为这完全符合OP的要求。OP要求使用三元组,其中
d[“a,b”]
。两个返回值都有4个值(
1,2,3,4
),而不是比较器中暗示的3个值(
a,b,c)
。@legostrmtropr您是对的。我现在在解决方案中解决了这个问题。请检查一下,不太清楚。在你的原稿中,你的答案是
('1,4','1,3','2,4')
。如果
a,b=1,4
a,c=1,3
,则
b,c
必须等于
1,4
,而不是您提供的解决方案中的
2,4
。下面我有一个解决方案,但是没有三元组匹配OPs给定的条件,这使得这更困难。@Legostrmtroopr你确定我们在比较密钥吗?我不这么认为<代码>d[“a,b”]。我们正在比较字典的值。您需要比较这些值,但键并不像您所说的那么简单。您需要找到三个值,
a,b,c
,这样
d[“a,b”]
。重读我最后的评论,你会发现你的答案与OP的要求不符。我认为这不太符合OP的要求。OP要求使用三元组,其中
d[“a,b”]
。两个返回值都有4个值(
1,2,3,4
),而不是比较器中暗示的3个值(
a,b,c)
。@legostrmtropr您是对的。我现在在解决方案中解决了这个问题。请检查一下,不太清楚。在你的原稿中,你的答案是
('1,4','1,3','2,4')
。如果
a,b=1,4
a,c=1,3
,则
b,c
必须等于
1,4
,而不是您提供的解决方案中的
2,4
。下面我有一个解决方案,但是没有三元组匹配OPs给定的条件,这使得这更困难。@Legostrmtroopr你确定我们在比较密钥吗?我不这么认为<代码>d[“a,b”]。我们正在比较字典的值。您需要比较这些值,但键并不像您所说的那么简单。您需要找到三个值,
a,b,c
,这样
d[“a,b”]
。重新阅读我的上一条评论,你会发现你的答案与OP要求的答案不符。你能解释一下.join在做什么吗?请注意,如果你想要捕捉的只是
KeyError
,那么最好编写
,KeyError除外:
;-)@我无意得到最快的回答;)但是谢谢:)@user2767074
string.join(t,a)
获取数组
a
的所有元素,并在每个元素之间插入字符串
t
。如果
a
只有一件事,它只返回
a
的字符串表示。您能解释一下.join在做什么吗?请注意,如果您只想捕获
KeyError
,编写
要比编写KeyError:
;-)好得多@我无意得到最快的回答;)但是谢谢:)@user2767074
string.join(t,a)
获取数组
a
的所有元素,并在每个元素之间插入字符串
t
。如果
a
只有一件事,它就只需要重新开始
[(5, 6, 6), (3, 6, 6)]
d = {"1,2" : 3, "1,3" : 6, "1,4" : 5,
          "2,3" : 5, "2,4" : 6,
          "3,4" : 9,
      "a,b" : 1, "a,c" : 2, "b,c": 2
    }

parts = set(",".join(d.keys()).split(',')) # Get all parts of the keys
import itertools
for a,b,c in itertools.permutations(parts,3):
    # Get each possible permutation of a,b,c
    try:
        # Try and find an item that matches the condition
        if d[",".join([a,b])] < d[",".join([a,c])] == d[",".join([b,c])]:
            print (a,b,c)
    except KeyError:
        pass # keyerror