比较两个键值的元素

时间:2013-12-01 15:30:59

标签: python dictionary

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()}

几乎一行一行易于理解

2 个答案:

答案 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