如果value在字典中,则将键添加到数组中,否则将值添加到其他列表中

时间:2018-06-27 02:10:24

标签: python dictionary

我有以下字典:

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 :(得分:2)

起初,我认为@ᴡʜᴀᴄᴋᴀᴍᴀᴅᴏᴏᴅʟᴇ3000 answers可能是最快的答案,如果您不喜欢尝试捕捉错误,则可以使用以下示例之一:

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 answersD()@Mike Robinsy answers。输出为:

2.4083618169348338
2.548082368010459
3.629124371952302
1.7721276028098547

所以,速度更快的是Mike,然后是我,最后是Whack。但是,您要决定自己的编码方式:尝试捕获,循环和理解,或者设置和&

答案 1 :(得分:1)

只有这样的声明:

if not element in d.keys()
    list2.add(element)

答案 2 :(得分:1)

只需将两个单独的列表理解与条件语句一起使用

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]

答案 3 :(得分:1)

您可以使用sets进行调查:

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'])

答案 4 :(得分:0)

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)

尝试一下