1 回答
TA贡献1789条经验 获得超8个赞
更新:意识到OP的文本正在处理非唯一的查找。添加了一段来描述如何做到这一点。
如果您发现自己多次循环字典列表来执行查找,请将列表重组为字典,以便查找成为键。例如这个:
a = [{"id": 1, "value": "foo"}, {"id": 2, "value": "bar"}]
for item in a:
if item["id"] == 1:
print(item["value"])
可以变成这样:
a = [{"id": 1, "value": "foo"}, {"id": 2, "value": "bar"}]
a = {item["id"]: item for item in a} # index by lookup field
print(a[1]["value"]) # no loop
... # Now we can continue to loopup by id eg a[2] without a loop
如果它是非唯一查找,您可以执行类似的操作:
indexed = {}
a = [{"category": 1, "value": "foo"}, {"category": 2, "value": "bar"}, {"category": 1, "value": "baz"}]
for item in a: # This loop only has to be executed once
if indexed.get(item["category"], None) is not None:
indexed[item["category"]].append(item)
else:
indexed[item["category"]] = [item]
# Now we can do:
all_category_1_data = indexed[1]
all_category_2_data = indexed[2]
如果出现索引错误,请使用默认字典索引来更轻松地处理
if a.get(1, None) is not None:
print(a[1]["value"])
else:
print("1 was not in the dictionary")
在我看来,这个 API 没有任何“Pythonic”,但如果 API 返回您需要循环的列表,那么它可能是一个设计糟糕的 API
更新:好的,我会尝试修复您的代码:
def download_vid(topics_data, ydl_opts):
indexed_data = {'reddit': [], 'gfycat': [], 'thumbnail': []}
for item in topics_data['vid']:
if item.get('reddit_video', None) is not None:
indexed_data['reddit'].append(item)
elif item.get('type', None) == "gfycat.com":
indexed_data['gfycat'].append(item)
elif item.get('oembed', None) is not None:
if item['oembed'].get('thumbnail_url', None) is not None:
indexed_data['thumbnail'].append(item)
for k, v in indexed_data.items():
assert k in ('reddit_video', 'gfycat', 'thumbnail')
if k == 'reddit_video':
B = v['reddit_video']['fallback_rul']
...
elif k == 'gfycat':
C = v['oembed']['thumbnail_url']
...
elif k == 'thumbnail':
D = v['oembed']['thumbnail_url']
...
以防万一不清楚为什么这样更好:
OP 循环了 topic_data['vid'] 3 次。我做了两次。
更重要的是,如果加更多的题目,我仍然只做两次。OP将不得不再次循环。
无异常处理。
现在每组对象都已编入索引。所以OP可以做,例如indexed_data['gfycat']来获取所有这些对象(如果需要的话),这是一个哈希表查找,所以它很快
添加回答
举报