将列表或字符串转换为字典并仅返回该字典中的特定键/值

Dav*_*vid 0 python dictionary function

我一直在研究一个可以将列表/字符串转换为字典的函数,并且我能够成功地在一堆不同的样本上运行它.例如,我拿了一个字母表中的字母列表(az)并为它们分配了一个数字(1-26):

import string
mylist = list(string.ascii_lowercase)

def list_conversion(items):
    print(dict(enumerate(items, 1)))
Run Code Online (Sandbox Code Playgroud)

所以当我打电话时,list_conversion(mylist)我得到了我正在寻找的输出:

{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j', 11: 'k', 12: 'l', 13: 'm', 14: 'n', 15: 'o', 16: 'p', 17: 'q', 18: 'r', 19: 's', 20: 't', 21: 'u', 22: 'v', 23: 'w', 24: 'x', 25: 'y', 26: 'z'}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何运行此函数并仅返回特定的键/值.例如,我想返回奇数键的值.我理解如何在一个孤立的实例中执行此操作:

d = {'x': 1, 'y': 2, 'z': 3} 
for key, value in d.items():
    if value%2 != 0:
        print(key)
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何正确地将其构建到我的函数中.我如何在我的函数中构建这样一个for循环,只返回偶数/奇数值,更广泛地说,如何只返回我从这个函数中选择的特定键/值?我认为像这样的东西会起作用:

def list_conversion(items):
    print(dict(enumerate(items, 1)))

list_conversion(mylist)

for key, value in mylist.items():
    if value%2 != 0:
        print(key)
Run Code Online (Sandbox Code Playgroud)

但是,我得到了AttributeError: 'list' object has no attribute 'items'这样的感觉,我在这里走错了路.

g.d*_*d.c 5

要回答更广泛的问题,您需要提供一些机制,通过该机制可以确定密钥是否允许您的结果.我会像这样修改你的函数:

>>> import string
>>> 
>>> def list_conversion(alist, filterfunc = None):
...   # Handle the case where you just want all values
...   if filterfunc is None:
...     return dict(enumerate(alist, 1))
...   # Handle other cases where filterfunc is a callable
...   return {k: v for k, v in enumerate(alist, 1) if filterfunc(k)}
... 
>>> list_conversion(string.ascii_lowercase, lambda x: x % 2) # odds
{1: 'a', 3: 'c', 5: 'e', 7: 'g', 9: 'i', 11: 'k', 13: 'm', 15: 'o', 17: 'q', 19: 's', 21: 'u', 23: 'w', 25: 'y'}
>>> list_conversion(string.ascii_lowercase, lambda x: not x % 2) # evens
{2: 'b', 4: 'd', 6: 'f', 8: 'h', 10: 'j', 12: 'l', 14: 'n', 16: 'p', 18: 'r', 20: 't', 22: 'v', 24: 'x', 26: 'z'}
Run Code Online (Sandbox Code Playgroud)

您也可以传递更具体的功能:

>>> def arbitrary(key):
...   wanted = [1,5,12,13,15]
...   return key in wanted
... 
>>> list_conversion(string.ascii_lowercase, arbitrary)
{1: 'a', 15: 'o', 12: 'l', 5: 'e', 13: 'm'}
Run Code Online (Sandbox Code Playgroud)