Как уникально диктовать по значению? - PullRequest
3 голосов
/ 15 июля 2010

Я хочу, чтобы уникальные повторяющиеся значения в dict. Это выглядит так:

d = {
"a":1,
"b":2,
"c":2,
"d":3,
"e":4,
"f":5,
"g":1,
"h":2,
"i":2,
"j":1,
"k":1}

Вот что я сделал:

# sort and unique the dict values
obj = d.values()
K = []
K = sorted(list(zip(*[(x,K.append(x)) for x in obj if not x in K])[0]

V=[]
for v1 in L:  
     V.append([k for k, v in obj.iteritems() if v == v1][0])
d_out = dict(zip(K, V))  

1. Итак, K, V будет в правильном порядке? Кроме того, это может быть немного сложным, может кто-нибудь дать простое решение для уникального диктанта по его значениям?

2. Может ли следующее быть более простым?

for v1 in L:  
     V.append([k for k, v in obj.iteritems() if v == v1][0])

Это не работает в моем тестировании:

[V.append([k for k, v in obj.iteritems() if v == v1][0]) for v1 in L] 

3. Я понял, что могу использовать значение ключа подкачки для достижения этого (уникальное значение по его значению), но я понятия не имею, как выбрать ключ, когда подкачка вызвала конфликт ключей с этим:

dict((value, key) for key, value in my_dict.iteritems())  

Я знаю, если поменять его местами значение будет уникальным, однако это просто перезаписывает ключ при возникновении конфликта клавиш, не давая возможности сделать выбор. Я смущен, почему это не дает ключевой ошибки конфликта? И можно ли что-то сделать, чтобы выбрать ключ рядом с безобразным способом перезаписать ключ нового диктанта позже?

4. Я искал и нашел некоторые "None" значения для python dict, которые хорошо обсуждались, любой может дать мне пример того, для чего он используется и на что это повлияет при использовании python dict?

Ответы [ 3 ]

3 голосов
/ 24 июля 2010
  1. Диктовка не является последовательностью. Там нет заказа.

  2. Вам нужен более простой общий подход.

  3. Диктовка не дает «ошибку конфликта ключей». Предполагается, что вы хотите перезаписать старое значение новым.

  4. Я не понимаю, о чем вы здесь спрашиваете.

Решение, приведенное ниже, представляет собой более простой способ удаления значений дублирования из словаря. Настройте либо сортировку, либо цикл вставки, чтобы указать, какие клавиши должны появляться в окончательном тексте.

d = {
    "a":1,
    "b":2,
    "c":2,
    "d":3,
    "e":4,
    "f":5,
    "g":1,
    "h":2,
    "i":2,
    "j":1,
    "k":1}

# Extract the dictionary into a list of (key, value) tuples.
t =  [(k, d[k]) for k in d]

# Sort the list -- by default it will sort by the key since it is
# first in the tuple.
t.sort()

# Reset the dictionary so it is ready to hold the new dataset.
d = {}

# Load key-values into the dictionary. Only the first value will be
# stored.
for k, v in t:
    if v in d.values():
        continue
    d[k] = v

print d
2 голосов
/ 15 июля 2010
try it out:

from collections import defaultdict
dout = defaultdict(dict)
for k,v in d.iteritems():
    dout[v] = k 
dout = dict(dout)
fdict = dict(zip(dout.values(), dout.keys()))

N.B .: у словаря нет дублирующего ключа, поэтому у входного словаря нет дублирующего ключа надеюсь, это будет работать

1 голос
/ 24 июля 2010

Может быть, это немного поможет:

import collections

d = ... # like above
d1 = collections.defaultdict(list)

for k, v in d.iteritems():
    d1[v].append(k)

print d1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...