簡體   English   中英

如果使用python列表理解嵌套嵌套循環

[英]if else nested for loops using python list comprehension

誰能幫我找出產生以下輸出的列表理解方式-

讓給定列表為-

results = [
    {"id":  1, "name":  "input"},
    {"name": "status", "desc": "Status"},
    {"name": "entity", "fields": [
        {"id": 101, "name": "value"},
        {"id": 102, "name": "address"}]
    }
]

我正在尋找列表形式的輸出。 獲得輸出的代碼是:

output = []
for eachDict in results:
    if "fields" in eachDict:
        for field in eachDict["fields"]:
            output.append(eachDict["name"]+"."+field["name"])
    else:
        output.append(eachDict["name"])

因此,使用上述代碼的輸出是-

['input', 'status', 'entity.value', 'entity.address']

如果在列表理解中嵌套了for循環,是否有可能獲得類似的輸出?

如果列表理解的條件,我在嘗試訪問該內部for循環時遇到麻煩

我的嘗試-

output = [eachDict["name"]+"."+field["name"] for field in eachDict["fields"] if "fields" in eachDict else eachDict["name"] for eachDict in results]

將您的代碼轉換為可行代碼的一種方法是使內部循環產生列表,然后將結果展平。

sum(([d['name'] + '.' + f['name'] for f in d['fields']] 
    if d.get('fields') else [d['name']] for d in results), [])

列表推導具有固定數量的(嵌套)循環。 因此,這里必須有兩個循環,一個在頂級字典上,另一個在fields 訣竅是如果沒有字段,則在嵌套循環中產生一個迭代:

[d['name'] + fieldname 
 for d in results
 for fieldname in (
    ('.' + sub['name'] for sub in d['fields']) if 'fields' in d else
    ('',))
]

for fieldname回路循環要么在名稱fields子目錄(用'.'前綴), 在與它只是一個空字符串的元組。

請注意,這實際上並不是所有可讀性。 我將產生fieldname循環委托給一個輔助生成器函數來改善這一點:

def fieldnames(d):
    if 'fields' in d:
        for sub in d['fields']:
            yield '.' + sub['name']
    else:
        yield ''

[d['name'] + fieldname for d in results for fieldname in fieldnames(d)]

演示:

>>> def fieldnames(d):
...     if 'fields' in d:
...         for sub in d['fields']:
...             yield '.' + sub['name']
...     else:
...         yield ''
...
>>> [d['name'] + fieldname for d in results for fieldname in fieldnames(d)]
['input', 'status', 'entity.value', 'entity.address']

暫無
暫無

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

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