截断字典列表值

时间:2016-06-28 13:30:00

标签: python list dictionary truncate

我试图找到字典中匹配值的键。但要获得任何类型的有效匹配,我需要截断列表中的值。

我想截断十分位数(例如" 2.21"到" 2.2")。

dict1 = {'red':[1.98,2.95,3.83],'blue':[2.21,3.23,4.2333],'orange':[3.14,4.1,5.22]}

dict2 = {'green':[3.11,4.12,5.2],'yellow':[2.2,3.2,4.2],'red':[5,2,6]}

matches = []
for key1 in dict1:
    for key2 in dict2:
        if dict1[key1] == dict2[key2]:
            matches.append((key1, key2))

print(matches)

我试图让"green""orange"匹配,以及"blue""yellow"。但我不确定是否需要先解析每个值列表,进行更改,然后继续。如果我能在比较中做出理想的改变。

4 个答案:

答案 0 :(得分:3)

d = {'green': [3.11, 4.12, 5.2]}

>>> map(int, d['green'])
[3, 4, 5]

在比较之前,您需要将列表项映射到整数

for key2 in dict2:
    if map(int, dict1[key1]) == map(int, dict2[key2]):
        matches.append((key1, key2))

我假设您想要向下舍入。如果要舍入到最接近的整数,请使用round而不是int

答案 1 :(得分:2)

您可以在列表中使用zip并比较值,但是您应该设置一个容差tol,其中两个列表中的一对值将被视为相同:

dict1 = {'red':[1.98,2.95,3.83],'blue':[2.21,3.23,4.2333],'orange':[3.14,4.1,5.22]}
dict2 = {'green':[3.11,4.12,5.2],'yellow':[2.2,3.2,4.2],'red':[5,2,6]}

matches = []
tol = 0.1 # change the tolerance to make comparison more/less strict
for k1 in dict1:
    for k2 in dict2:
        if len(dict1[k1]) != len(dict2[k2]):
            continue
        if all(abs(i-j) < tol for i, j in zip(dict1[k1], dict2[k2])):
            matches.append((k1, k2))

print(matches)
# [('blue', 'yellow'), ('orange', 'green')]

如果您的列表长度始终相同,则可以删除跳过不匹配长度的部分。

答案 2 :(得分:2)

您可以在循环之间添加一些列表推导,以将浮点数转换为整数,如下所示:

dict1 = {'red':[1.98,2.95,3.83],'blue':[2.21,3.23,4.2333],'orange':[3.14,4.1,5.22]}

dict2 = {'green':[3.11,4.12,5.2],'yellow':[2.2,3.2,4.2],'red':[5,2,6]}

matches = []
for key1 in dict1:
    for key2 in dict2:
        dict1[key1] = [int(i) for i in dict1[key1]]
        dict2[key2] = [int(i) for i in dict2[key2]]

        if dict1[key1] == dict2[key2]:
            matches.append((key1, key2))
print(matches)

输出:

[('blue', 'yellow'), ('orange', 'green')]

我希望这会有所帮助:)

答案 3 :(得分:2)

如果你关心的只是截断,而不是实际的舍入,你可以将值转换为字符串并切掉多余的字符串:

for key1 in dict1:
    for key2 in dict2:
        # I'm pulling these values out so you can look at them:
        a = str(dict1[key1])
        b = str(dict1[key2])
        # find the decimal and slice it off
        if a[:a.index('.')] == b[:b.index('.')]:
            matches.append((key1, key2))

如果你想实际上是圆的,请使用内置的round(float, digits)https://docs.python.org/2/library/functions.html):

for key1 in dict1:
    for key2 in dict2:
        if round(dict1[key1],0) == round(dict2[key2], 0):
            matches.append((key1, key2))

(另外,注意你的缩进!)