![](/img/trans.png)
[英]Function returning a dictionary with string lengths (keys) and number of occurrence (values) from a list
[英]Converting a list or string into a dictionary and returning only specific keys/values from that dictionary
我一直在研究一个可以将列表/字符串转换成字典的函数,并且能够在一系列不同的示例上成功运行它。 例如,我列出了字母(az)中的字母并为其分配了一个数字(1-26):
import string
mylist = list(string.ascii_lowercase)
def list_conversion(items):
print(dict(enumerate(items, 1)))
所以当我调用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'}
但是,我不确定如何运行此功能,仅返回特定的键/值。 例如,我想返回奇数键的值。 我了解如何在隔离的实例中执行此操作:
d = {'x': 1, 'y': 2, 'z': 3}
for key, value in d.items():
if value%2 != 0:
print(key)
但是我不知道如何正确地将其构建到我的函数中。 如何将这样的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)
但是,我得到了AttributeError: 'list' object has no attribute 'items'
所以我感觉我走错了路。
要回答更广泛的问题,您需要提供某种机制,通过该机制可以确定密钥是否适合您的结果。 我会这样修改您的功能:
>>> 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'}
您还可以传递一个更具体的函数:
>>> 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'}
最好从功能中删除print
。
def list_conversion(items):
return {i: x for i, x in enumerate(items, 1) if i % 2 == 1}
对代码进行各种更改。 list_conversion
应该返回一个字典。 无需将string.ascii_lowercase
转换为列表,因为enumerate
将迭代字符串的元素。 最后,我使用列表理解来提高效率,而不是循环。
import string
def list_conversion(items):
return dict(enumerate(items, 1))
mylist = list_conversion(string.ascii_lowercase)
[k for k, v in mylist.items() if k%2 != 0]
# [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.