簡體   English   中英

將列表或字符串轉換為字典,並僅返回該字典中的特定鍵/值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM