2016-07-07 3 views
-3

В настоящее время я пытаюсь исправить этот фрагмент кода, который я писал недавно. Он должен взять список и dict (ниже), а затем, если элемент в списке соответствует элементу в словаре, он должен добавить его в список. Я знаю, что он пытается сопоставить элементы в списке с неправильной частью dict, но я не знаю, как это исправить. Любая помощь будет принята с благодарностью!Замена элементов списка с помощью dict

[1,2,3,4,5,6,7,8] 
{'a': 1,'b': 2,'c': 3} 

text_print('\nPlease input your file location: ') 
    location = input() 
    with open(location) as f: 
     c = literal_eval(f.readline()) 
     d = literal_eval(f.readline()) 
    n_string = [] 
    text_print(str(c)) 
    text_print('\n') 
    text_print(str(d)) 
    for item in c: 
     if item in d: 
      n_string.append(str(item)) 
    text_print(str(n_string)) 

код должен вывести A B C D и т.д.

+1

Почему не переключаются ключей и значений в dictionnary, т.е. '{1: 'а', 2: 'B', 3: 'с'}' вместо '{ 'а': 1, 'b': 2, 'c': 3} '? – aluriak

+0

Хотите совместить элементы в списке с ** ключами **, ** значениями ** или ** элементами ** в dict? – MisterMiyagi

ответ

0

Перейдите по словарю, чтобы узнать, находятся ли какие-либо значения в списке в словаре. Если имеется, добавьте ключ в список result.

my_list = [1,2,3,4,5,6,7,8] 
my_dict = {'a': 1,'b': 2,'c': 3,'d':3,'e':15} 

result = [] 
for num in my_list: 
    for key,value in my_dict.items(): 
     if num == value: 
     result.append(key) 

print result 

Выход:

[ 'а', 'б', 'с', 'd']

Чтобы уменьшить количество сравнений вы можете получить пересечение списка и ключи словаря и повторение этого.

set(my_list).intersection(my_dict.values()) 
0

Вы должны переключить ключи и значения в dict. Предполагая, что вы не можете изменить вход, вы можете преобразовать Dict после его загрузки:

d2 = {val: key for key, val in d.items()} 

Затем вы можете непосредственно искать предметы.

for item in c: 
    try: 
     n_string.append(str(d2[item])) 
    except KeyError: 
     pass 
text_print(str(n_string)) 
+0

Что происходит, если значение повторяется? –

+0

@PadraicCunningham По определению вашей проблемы это не определено.Что будет на практике, так это то, что при конверсии будет сохранено только одно из этих значений. Для каждого ключа: значение с тем же значением, это последняя пара, прочитанная, хотя порядок считывания пар произволен. – MisterMiyagi

+0

@ MisterMyagi, это был скорее риторический вопрос. Вы не можете безопасно переключать значения и клавиши. кроме проблемы с потенциально потерей данных, вам также нужны хешируемые значения, которые могут не всегда иметь место. –

0

Это потому, что вы проверяете Dict в сравнении с элементом списка if item in d. Извлеките значения dict d.vales() и выполните сравнение. После того, как n_string значения выбираются в этой операции, запустить цикл с ключами, значения, как показано ниже:

[1,2,3,4,5,6,7,8] 
{'a': 1,'b': 2,'c': 3} 

text_print('\nPlease input your file location: ') 
    location = input() 
    with open(location) as f: 
     c = literal_eval(f.readline()) 
     d = literal_eval(f.readline()) 
    n_string = [] 
    nn_string = [] 
    text_print(str(c)) 
    text_print('\n') 
    text_print(str(d)) 
    for item in c: 
     if item in d.values(): 
      n_string.append(str(item)) 
    text_print(str(n_string)) 

    for itemcur in n_string: 
     for key, value in d.iteritems(): 
      if str(value) == str(itemcur): 
       nn_string.append(str(key)) 
    print(str(nn_string)) 

Пожалуйста, позаботьтесь об ошибке отступа, если таковые имеются. Обеспечьте необходимые пространства!

2

Я не уверен, что понимаю цели файлов. Не могли бы вы дать больше информации об этом? В вашем примере есть «c» список или словарь? А что такое «d»?

В любом случае, в вашем цикле вы просто сравниваете ключи словаря с элементами списка, поэтому ни один из них не будет соответствовать, поскольку элементы списка - это числа, а ключи словаря - буквы. Вам нужно сравнить значения словаря с пунктами вашего списка. Я привел вам пример ниже.

yourlist = [1,3] 
yourdict = {'a': 1,'b': 2,'c': 3} 

n_string = [] 
for key in yourdict: 
    if yourdict[key] in yourlist: 
     n_string.append(key) 

print(n_string) 

В этом примере анализируется словарь и проверяется, находятся ли его значения в списке. Если значение (число) находится в списке, то оно добавляет ключ (буква) в выходной список.

+2

Не указывайте переменные, такие как встроенные, т. Е. Не используйте 'dict' и' list' как имена! – MisterMiyagi

+1

Извините, новичок в этом сайте, я подумал, что будет ясно. Ты прав! Я отредактировал свой ответ, чтобы исправить это :) – oldabl

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