вернуть ключ, значения которого повторяются - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть словарь, значения ключей которого являются списками.каждый список может содержать несколько значений, повторяющихся более одного раза, например:

{'VSS': ['A2', 'A3', 'A1'], 'X_P1_1': ['A2', 'A1'], 'X_P2': ['A3', 'A2'], 'X_P1_3': ['A2', 'A1'], 'VDD': ['A3', 'A3', 'A3', 'A3', 'A3', 'A3', 'A3', 'B', 'A3'], 'X': ['B', 'A1', 'A1', 'A1', 'A1', 'A1', 'A1', 'A1', 'B', 'A1']}

Я хочу сделать цикл, который принимает ключи, значения которых имеют частоты более 1, например:

VDD: ['A3':8]
X : ['A1':8, 'B':2]

howэто можно сделать?

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Использование collections.Counter:

from collections import Counter

# count values in lists, only including counts greater than 1
c = {k: {val: count for val, count in Counter(v).items() if count > 1} \
     for k, v in d.items()}

# isolate only keys where Counter value is non-empty
res = {k: v for k, v in c.items() if v}

{'VDD': {'A3': 8},
 'X': {'B': 2, 'A1': 8}}
0 голосов
/ 12 ноября 2018

Первым шагом является обратное отображение.

valuekeydict = {}
for k, vs in orig_dict.items():
    for v in vs:
        valuekeydict.setdefault(v, []).append(v)

Затем возьмите набор всех значений, где len> 1

result = {v for vs in valuekeydict.values() for v in vs if len(vs) > 1}
0 голосов
/ 12 ноября 2018

Вы можете использовать Счетчик :

from collections import Counter

data = {'VSS': ['A2', 'A3', 'A1'], 'X_P1_1': ['A2', 'A1'], 'X_P2': ['A3', 'A2'], 'X_P1_3': ['A2', 'A1'], 'VDD': ['A3', 'A3', 'A3', 'A3', 'A3', 'A3', 'A3', 'B', 'A3'], 'X': ['B', 'A1', 'A1', 'A1', 'A1', 'A1', 'A1', 'A1', 'B', 'A1']}


result = {key : { e: count for e, count in Counter(values).items() if count > 1}  for key, values in data.items() if any(value > 1 for value in Counter(values).values())}

print(result)

выход

{'VDD': {'A3': 8}, 'X': {'B': 2, 'A1': 8}}

Или, если вы предпочитаете значения в виде списка кортежей:

from collections import Counter

data = {'VSS': ['A2', 'A3', 'A1'], 'X_P1_1': ['A2', 'A1'], 'X_P2': ['A3', 'A2'], 'X_P1_3': ['A2', 'A1'],
        'VDD': ['A3', 'A3', 'A3', 'A3', 'A3', 'A3', 'A3', 'B', 'A3'],
        'X': ['B', 'A1', 'A1', 'A1', 'A1', 'A1', 'A1', 'A1', 'B', 'A1']}

result = {key: [(element, count) for element, count in counts.items() if count > 1] for key, counts in map(lambda x: (x[0], Counter(x[1])), data.items()) if
          any(count > 1 for count in counts.values())}
print(result)

выход

{'VDD': [('A3', 8)], 'X': [('A1', 8), ('B', 2)]}
...