尝试将字典中的键值与嵌套列表元素进行匹配
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)
答案 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']]