[英]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
檢查r
的dict 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.