比较字典键,值与嵌套列表元素 - Python

时间:2015-06-15 21:50:03

标签: python dictionary nested-lists

尝试将字典中的键值与嵌套列表元素进行匹配

dict = {'a':[1, 5], 'c':[7, 9], 'f':[10, 12], 'b':[15, 20]}
list_A = [['a', '4'], ['a', '7'], ['b', '17'], ['b', 10], ['c', '7'], ['d', '7'], ['f', '11'], ['f', '12']]
list_A_no_reps =['a', 'b', 'c', 'd', 'f']

我试图得到一个列表,其中的值与list_A和dict匹配,即列表a的值(嵌套列表中的第二个元素)应该位于dict的值列表对之间。

match_list = [['a', '4'], ['b', '17'], ['c', '7'], ['f', '11'], ['f', '12']]

我试图首先将dict的键与list_A_no_reps匹配,如果匹配,我试图找出它是否位于每个键值对之间。到目前为止我有这个:

g = []
for key, values in dict.items():
   for element in list_A_no_rep:
      if key == element:
         for cord in list_A:
            if (values[0] <= int(cord[1]) <= values[2]):
               g.append(cord)

4 个答案:

答案 0 :(得分:2)

您可以尝试:

g = []
for key, values in dict.items():
    if key in list_A_no_rep:
        for cord in list_A:
        if ( cord[0] == key ):
                if (values[0] <= int(cord[1]) <= values[1]):
                    g.append(cord)
print g

输出:

[['a', '4'], ['c', '7'], ['b', '17'], ['f', '11'], ['f', '12']]

代码中的修改:

g = []
for key, values in dict.items():
    for element in list_A_no_rep:
        if key == element:
            for cord in list_A:
                if ( cord[0] == element ): #line added
                    if (values[0] <= int(cord[1]) <= values[1]):
                        g.append(cord)

您的代码中的问题是您正在检查list_A的所有其他元素。因此,您将获得可能在某个其他键范围范围内的不需要的值。因此需要if条件来检查是否正在进行与相同密钥的有效比较。

例如,如果没有条件,则您会使用['a','7']检查c:[7,9]。因此,即使它不满足为g指定的范围,您也可以将其包含在a中。

答案 1 :(得分:1)

我会通过第一个元素将字母表中的子列表分组,然后迭代原始字典并检查每个键是否在分组字典中并进行比较。

d = {'a': [1, 5], 'c': [7, 9], 'f': [10, 12], 'b': [15, 20]}

list_A = [['a', '4'], ['a', '7'], ['b', '17'], ['b', 10], ['c', '7'], ['d', '7'], ['f', '11'], ['f', '12']]

from collections import defaultdict

d2 = defaultdict(list)

for k,v in list_A:
    d2[k].append(v)

out = []
for k, v in d.items():
    if k in d2:
        vals = d2[k]
        for v2 in vals:
            if v[0] <= int(v2) <= v[1]:
                out.append([k,v2])
print(out)
['a', '4'], ['c', '7'], ['b', '17'], ['f', '11'], ['f', '12']]

或使用viewkeys获取公共密钥:

out = []
for k in d.viewkeys() & d2.viewkeys():
    vals, v = d2[k], d[k]
    for v2 in vals:
        if v[0] <= int(v2) <= v[1]:
            out.append([k,v2])

或者只是循环遍历listA:

d = {'a': [1, 5], 'c': [7, 9], 'f': [10, 12], 'b': [15, 20]}

list_A = [['a', '4'], ['a', '7'], ['b', '17'], ['b', 10], ['c', '7'], ['d', '7'], ['f', '11'], ['f', '12']]

out = []
for sub in list_A:
    k, val = sub
    if k in d:
        v = d[k]
        if v[0] <= int(val) <= v[1]:
            out.append(sub)
print(out)
[['a', '4'], ['b', '17'], ['c', '7'], ['f', '11'], ['f', '12']]

答案 2 :(得分:0)

<强>更新

values[2]更改为values[1]

由于您的词典有两个元素且索引编号为零,因此[1, 5]会导致values[0] == 1 and values[1] == 5

此外,您可能希望找到更好的解决方案,省略list_A_no_reps并移除if key == element块,然后使用cord[0]进行比较。

答案 3 :(得分:0)

d = {'a':[1, 5], 'c':[7, 9], 'f':[10, 12], 'b':[15, 20]}
li = [['a', '4'], ['a', '7'], ['b', '17'], ['b', 10], ['c', '7'], ['d', '7'], ['f', '11'], ['f', '12']]

d中为li中的每组值查找一个键更快,而不是遍历d中每个键的列表。这可以使用list comprehension

在一行中完成
match_li = [v for v in li if v[0] in d and  d[v[0]][0] <= int(v[1]) <=  d[v[0]][2]]

产量

[['a', '4'], ['b', '17'], ['c', '7'], ['f', '11'], ['f', '12']]