簡體   English   中英

通過列表理解或任何其他方法解決嵌套dict迭代

[英]Solving nested dict iteration by list comprehension or any other method

我有一個dict ,里面有另一個dict

d1 = {'a':{'p':1, 'q':2, 'r':'abc'}, 
      'b':{'p':5, 'q':6, 'r':["google", "pypi.org"]}
     }
url1 = "https://google.com"
url2 = "https://abc.com"

現在我要做的是從兩個dict values檢查rdict values但我不希望有任何代碼冗余,那怎么可能?

我現在正在做的是:

for k, v in d1.iteritems():
    if isinstance(v['r'], list):
        for l in v['r']:
            if url1.find(l):
                ..Do something..
            else:
                continue
    else:
        if url1.find(v['r'):
                ..Do Something same as above..
            else:
                continue

現在問題出現在相同的Do something 兩次重復的 Do something ,有沒有一種方法可以通過理解或其他方法解決冗余,除了函數的制作和調用

編輯-代碼已經在大型函數定義中,因此除了提供另一個函數並調用它之外,還提供其他解決方案。

您可以轉換非列表項,即。 在這種情況下,將字符串轉換為列表,然后簡單地遍歷該列表。 而且您不需要else: continue部分:

for k, v in d1.iteritems():
    value = v['r'] if isinstance(v['r'], list) else [v['r']]
    for l in value:
        if url1.find(l):
           #Do something..

如果您認真對待python代碼的性能,並願意接受某些風格上的妥協,則假定您使用pypy ,以下形式的運行速度將與手動內聯代碼一樣快:

def inner():
    pass

for k, v in d1.items():
    if isinstance(v['r'], list):
        for l in v['r']:
            if url1.find(l):
                inner()
            else:
                continue
    else:
        if url1.find(v['r']):
            inner()
        else:
            continue

有關包括非空內部代碼和一些時序代碼的更實際的示例,請參見此鏈接。

請注意,正如您所寫的那樣,此版本比CPython下的內聯版本慢得多,當然,該版本沒有JIT內聯。

怪胎是對的。 使用函數將是最好的解決方案。 使用函數調用的開銷可以忽略不計,這可能比創建新列表和遍歷長度為1的列表要少。

但是,如果您想不惜一切代價避免代碼重復並避免多個函數調用,則可能需要考慮將代碼重寫為生成器函數。 這將產生您要一次處理的項目。

def loop(d1):
    for k, v in d1.iteritems():
        if isinstance(v['r'], list):
            for l in v['r']:
                if url1.find(l):
                    yield l
                else:
                    continue
        else:
            if url1.find(v['r']):
                yield v['r']
            else:
                continue

for item in loop(d1):
    print "do something"

暫無
暫無

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

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