簡體   English   中英

拼合列表的字典?

[英]Flatten dictionaries of list?

使用python 2.6.5,我試圖展平附加到每個字典鍵的所有列表,並在可能的情況下將它們作為一個唯一列表放到一個列表中。 我嘗試了兩種不同的功能,只是不確定我需要做什么。

我遇到的問題是它不是返回值列表而是鍵列表。

例如:

dict = {'alpha': [[], ['dg1']],
        'beta': [[], ['dg2'], ['dg3'], ['dg4'], ['dg1']],
        'charlie': [[], ['dg1']],
        'delta': [[], ['dg4']]}

new_list = flatten(dict)

結果為[alpha,beta,charile,delta] ,但我想要的是[dg1,dg2,dg3,dg4]

我嘗試過的是:

def flatten(a):
    b = []
    for c in a:
        if isinstance(c, list) and any(isinstance(i, list) for i in c):
            b.extend(flatten(c))
        else:
            b.append(c)
    return b

def flatten_list(lst):
    """
    Utility to flatten a list of list.
    If outer list is not list or None, it returns the original object.
    It will return None for None.
    """
    if not isinstance(lst, list):
        return lst
    return sum(([x] if not isinstance(x, list) else flatten_list(x)
                    for x in lst), [])

考慮一下這部分代碼中的邏輯:

if isinstance(c, list) and any(isinstance(i, list) for i in c):
    b.extend(flatten(c))
else:
    b.append(c)

如果c是一個列表,里面沒有任何列表,則只需將其appendb ,而不是extending 因此,如果b = [0]c = [1, 2] ,您將得到b = [0, [1, 2]]

如果c是列表,則需要始終擴展。 因此,您可以這樣做:

if isinstance(c, list):
    if any(isinstance(i, list) for i in c):
        b.extend(flatten(c))
    else:
        b.extend(c)
else:
    b.append(c)

這將起作用。 但是請考慮一下,如果您在已經平坦的列表上調用flatten會發生什么,那么您應該能夠進一步簡化它。


同時,如果您不知道如何平整字典中的每個值,則可以使用顯式循環來實現:

d = {'alpha': [[], ['dg1']], 'beta': [[], ['dg2'], ['dg3'], ['dg4'], ['dg1']], 'charlie': [[], ['dg1']], 'delta': [[], ['dg4']]}
new_d = {}
for k, v in d.items():
    new_d[k] = flatten(v)

我在那里使用過d.items() 在Python 2.x中,這為您提供了一個新列表,其中包含字典的所有鍵值對。 如果字典很大,那么僅使該列表在其上循環將是浪費的,因此您可能想使用d.iteritems() ,它為您提供了一個懶惰的迭代器而不是列表。


如果您知道什么是理解,則應將這種“創建一個空集合,循環,添加到該集合”模式作為轉換為理解的范例:

new_d = {k: flatten(v) for k, v in d.items()}

不幸的是,字典理解直到2.7才被添加。 但是,您可以通過dict函數和生成器表達式獲得相同的效果:

new_d = dict((k, flatten(v)) for k, v in d.items())

可讀性不高,但是效果相同,並且可以回溯到2.4。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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