Если значение находится в словаре, добавьте ключ в массив, иначе добавьте значение в другой список. - PullRequest
0 голосов
/ 27 июня 2018

У меня есть следующий словарь:

d = {'a': 1, 'B':2, 'C': 3, 'D':4, 'E': 5}

Этот мой следующий код:

arr = " a b c" 
arr_list = [d[a] for a in arr.split(" ")]

дает мне этот вывод:

 [1 2 3]

Но когда я передаю следующую строку:

arr = " a b c 1125"

Я получаю следующую ошибку:

KeyError: '1125'

, что имеет смысл, поскольку в моем словаре нет ключа для 1125. Но я хочу передать следующее своей функции:

arr = "a b c 1125"

и получите следующий вывод:

list1 = [1,2,3]

а затем еще один список со значением без ключа

list2 = [1125]

Итак, некоторые помогают мне понять, как получить значение без ключа в моем словаре для добавления в новый список и значения с ключами, добавленные в другой список?

Любая помощь приветствуется.

Ответы [ 5 ]

0 голосов
/ 27 июня 2018

Вы можете исследовать, используя комплекты :

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
arr = "a b c 1125"

xs = set(arr.split())
keys = set(d)

print xs & keys
print xs - keys

Выходы:

set(['a', 'c', 'b'])
set(['1125'])
0 голосов
/ 27 июня 2018

Сначала я думаю, что @ ᴡʜᴀᴄᴋᴀᴍᴀᴅᴏᴏᴅʟᴇ3000 ответов может быть самым быстрым ответом, и если вам не нравится пытаться отлавливать ошибки, вы можете сделать один из моих примеров:

list1=[]
list2=[]
d = {'a': 1, 'B':2, 'C': 3, 'D':4, 'E': 5}
arr = " a b c 1125"
for e in arr.split(" "):
    if e in d.keys():
        list1.append(d[e])
    else:
        list2.append(e)

(Вы можете сделать два списка понимания, если вы готовы пожертвовать немного большей скоростью ради меньшего количества строк кода ...)

d = {'a': 1, 'B':2, 'C': 3, 'D':4, 'E': 5}
arr = " a B C 1125"
list1 = [d[e] for e in arr.split() if e in d]
list2 = [e for e in arr.split() if e not in d]

Но теперь я провел тест с timeit.timeit и, к своему удивлению, обнаружил, что на самом деле это был не самый быстрый способ.

d = {'a': 1, 'B':2, 'C': 3, 'D':4, 'E': 5}
arr = " a b c 1125"
# Functions
# ...
if __name__ == "__main__":
    import timeit

    print(timeit.timeit("a()", setup="from __main__ import a"))
    print(timeit.timeit("b()", setup="from __main__ import b"))
    print(timeit.timeit("c()", setup="from __main__ import c"))
    print(timeit.timeit("D()", setup="from __main__ import D")) # D instaed of d because that is the OP dictionary

Где a() было моей первой функцией, b() моей второй, c() @ ᴡʜᴀᴄᴋᴀᴍᴀᴅᴏᴏᴅʟᴇ3000 ответов и D() было @ Майк Робинси отвечает . Выход был:

2.4083618169348338
2.548082368010459
3.629124371952302
1.7721276028098547

Итак, чем быстрее Майк, тем я и, наконец, Вжик. Но вы решаете выбрать свой стиль кодирования: try-catch, loop и comp понять, или наборы и &.

0 голосов
/ 27 июня 2018

просто есть заявление вроде:

if not element in d.keys()
    list2.add(element)
0 голосов
/ 27 июня 2018

Просто используйте два отдельных понимания списка с условными выражениями

In [518]: d = {'a': 1, 'b':2, 'c': 3, 'D':4, 'E': 5}

In [519]: arr = ' a b c 1125'

In [520]: list1 = [d[a] for a in arr.split() if a in d]

In [521]: list1
Out[521]: [1, 2, 3]

In [522]: list2 = [a for a in arr.split() if a not in d]

In [523]: list2
Out[523]: ['1125']

Обратите внимание, что содержимое list2 будет иметь тип str, если вы явно не приведете их к int. Это потому, что arr имеет тип str, который может быть достигнут следующим образом:

list2 = [int(a) for a in arr.split() if a not in d]
0 голосов
/ 27 июня 2018
list1=[]
list2=[]
d = {'a': 1, 'B':2, 'C': 3, 'D':4, 'E': 5}
arr = " a b c 1125"
for e in arr.split(" "):
    try:
        list1.append(d[e])
    except KeyError:
        list2.append(e)

Попробуйте это

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