Фильтровать весь словарь на основе значений только одного ключа - PullRequest
0 голосов
/ 10 января 2020

У меня есть этот дикт:

d1 = {"date":["2019-11","2019-11","2019-12","2019-12","2020-01","2020-01"],
      "shares":[28,16,5,10,1,1],
      "target":["INSTAGRAM","TEXT","INSTAGRAM","TEXT","INSTAGRAM","TEXT"]
     }

Я хочу отфильтровать весь словарь d1 только для target = INSTAGRAM, без использования pandas. Так что это ожидаемый результат:

{"date":["2019-11","2019-12","2020-01"],
 "shares":[28,5,1],
 "target":["INSTAGRAM","INSTAGRAM","INSTAGRAM"]
}

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Использование defaultdict:

from collections import defaultdict
d = defaultdict(list)
for i, target in enumerate(d1['target']):
    if target == 'INSTAGRAM':
        for k,v in d1.items():
            d[k].append(v[i])

print(d)
defaultdict(list,
            {'date': ['2019-11', '2019-12', '2020-01'],
             'shares': [28, 5, 1],
             'target': ['INSTAGRAM', 'INSTAGRAM', 'INSTAGRAM']})

Если вы хотите избежать импорта и использовать python '* dict класс:

d = dict()
for i, target in enumerate(d1['target']):
    if target == 'INSTAGRAM':
        for k,v in d1.items():
            if k in d.keys():
                d[k].append(v[i])
            else:
                d[k] = [v[i]]
1 голос
/ 10 января 2020

Это должно сработать:

def filter_by_key(key, value, _dict):
    """ Filter a dictionary by it's key value

    :param str key: Dictionary key to inspect
    :param str value: Value to look for inside the dictionary key
    :param dict _dict: Dictionary to inspect
    :return: Dictionary with filter applied
    """

    indexes = [index for index, item in enumerate(_dict[key])
               if _dict[key][index] == value]

    result_dict = {}
    for key, value in a.iteritems():
        result_dict[key] = [_dict[key][index] for index in indexes]
    return result_dict
a = {"date":["2019-11","2019-11","2019-12","2019-12","2020-01","2020-01"],
      "shares":[28,16,5,10,1,1],
      "target":["INSTAGRAM","TEXT","INSTAGRAM","TEXT","INSTAGRAM","TEXT"]
     }


result = filter_by_key('target', 'INSTAGRAM', a)
...