def equal_keys(d, key_one, key_two):
for key, value in key_one.items():
for key, value in key_two.items():
pass
给定一个字典和两个键,我们如何循环遍历值中的每个元素 指定的键并过滤掉与该索引处的每个键不匹配的任何元素。
离。
>>> equal_keys({'i.year': ['1997', '1997'], 'i.month': ['March', 'April'], 'j.month': ['March', 'April'], 'j.year': ['1997', '2003']}, 'i.year', 'j.year')
{'i.year': ['1997'], 'j.month': ['April'], 'i.month': ['April'], 'j.year': ['2003']}
所以它的作用:
{'i.year': ['1997', '1997'], 'i.month': ['March', 'April'], 'j.month': ['March', 'April'], 'j.year': ['1997', '2003']}
两个指定的键作为参数是i.year和j.year,所以我们比较键中的元素并检查它们是否相等。所以i.year中的第一个元素是1997年,而j.year中的第一个元素是1997年,它们是平等的,所以我们继续讨论下一个元素。 i.year中的下一个元素是1997,j.year中的下一个元素是2003,它们不相等所以我们删除了该索引的每个键中的每个元素,因此我们得到:
{'i.year': ['1997'], 'j.month': ['March'], 'i.month': ['March'], 'j.year': ['2003']}
虽然这确实有效:
def equal_keys(d, *keys):
indexes = [i for i, x in enumerate(zip(*(d[key] for key in keys)))
if len(set(x)) == 1]
return {key: [value[x] for x in indexes] for key, value in d.items()}
有没有办法写这个类似于开头代码的性质,有三个参数,没有拉链,没有导入,没有*,或者没有像这样的形式的衬线:
{key: [value[x] for x in indexes] for key, value in dct.items()}
几乎一行一行易于理解
答案 0 :(得分:2)
这几乎只是解开您所提供的内容,但希望更容易理解:
def matching_values_by_keys(d, key1, key2):
# figure out which elements of each list to keep
keep_indices = set()
for index,value in enumerate(d[key1]):
if value == d[key2][index]:
keep_indices.add(index)
# now go through each dictionary entry and keep the wanted elements
new_d = {}
for key,lst in d.items():
new_lst = []
for index,value in enumerate(lst):
if index in keep_indices:
new_lst.append(value)
new_d[key] = new_lst
return new_d
以及
运行时matching_values_by_keys({'i.year': ['1997', '1997'], 'i.month': ['March', 'April'], 'j.month': ['March', 'April'], 'j.year': ['1997', '2003']}, 'i.year', 'j.year')
返回
{'i.month': ['March'], 'i.year': ['1997'], 'j.month': ['March'], 'j.year': ['1997']}
我认为这是你的描述的正确答案('March',而不是上面给出的'April')。
答案 1 :(得分:1)
你去,没有导入,没有zip
,没有单行(除了一个;-), min
):
def equal_keys(d, *keys):
indexes = []
#get the length of shortest list
min_ = min(len(d[x]) for x in keys)
for i in xrange(min_):
items = [] #collect items on same index in this list
for key in keys:
items.append(d[key][i])
# If len(set(items)) != 1 means all items are not same, so add this
# index to indexes
if len(set(items)) != 1:
indexes.append(i)
dic = {}
#Now iterate over each (key, value) pair and for each value
#keep only those items that are present on the indices stored in indexes list.
for k, v in d.items():
dic[k] = []
for i in indexes:
dic[k].append(d[k][i])
return dic