2013-10-13 3 views
0

Мне нужно написать метод, используя словарь, который принимает список a и возвращает список, содержащий элементы a, которые происходят один раз, и элементы должны отображаться в том же порядке, что и их первое вхождение в a. Думаю ли я в правильном направлении? Это мой код:Как назначить ключ из списка для словаря?

def only_once(a): 
    d = {} 
    for i in a: 
     d['value'] = i 
    m = range(len(a)) 
    for num in m: 
     d['key'] = num 
    return d.value 

Как принимать элементы из списка a и сделать значение?

+0

Вам нужно использовать словарь? – BartoszKP

+0

Словари не сохраняют порядок, это может быть не очень полезно для пользователя, если вы хотите сохранить порядок появления. – jabaldonedo

+0

Да, я должен использовать словари. Может быть, внутри моей функции, просто чтобы проверить, что-то в ней. Но словарь должен быть здесь – user2847624

ответ

0

Вот наивное решение. Он в значительной степени использует dict как set, что глупо, потому что у python есть наборы. Но эй.

def only_once(a): 
    d = {} 
    for i in a: 
    d.setdefault(i,0) 
    d[i] += 1 
    return [i for i in a if d[i] == 1] 
+0

Большое спасибо. именно то, что мне нужно, и, кроме того, я это понимаю :) – user2847624

2

itertools имеет recipe для выполнения этой задачи:

def unique_everseen(iterable, key=None): 
    "List unique elements, preserving order. Remember all elements ever seen." 
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D 
    # unique_everseen('ABBCcAD', str.lower) --> A B C D 
    seen = set() 
    seen_add = seen.add 
    if key is None: 
     for element in ifilterfalse(seen.__contains__, iterable): 
      seen_add(element) 
      yield element 
    else: 
     for element in iterable: 
      k = key(element) 
      if k not in seen: 
       seen_add(k) 
       yield element 

BTW, так как вы хотите, чтобы быть таким же, словарь не поможет. A dict не поддерживает какой-либо заказ.

+0

'seen_add = seen.add' Для чего это? – BartoszKP

+0

@BartoszKP Создание копии функции 'add' –

+0

спасибо, но я ее совсем не понимаю – user2847624

0

Это мое решение, использующее Dict понимания и сортировка ключей Dict соответствующих значениями:

def only_once(a): 
    # create the dictionary using dict comprehension; 
    # add to the dictionary only if the number of occurences 
    # equals one 
    d = {x:a.index(x) for x in a if a.count(x) == 1} 

    # retrieve the dictionary keys as list and sort them by the value 
    # of their assigned dictionary values 
    return sorted(d.keys(), key = d.get) 

, но я согласен, что ДИКТ не самый удачный выбор для решения структуры данных этой проблемы.

Смежные вопросы