[英]append only if item isn't already appended?
在我的 Python 应用程序中,我有以下几行:
for index, codec in enumerate(codecs):
for audio in filter(lambda x: x['hls']['codec_name'] == codec, job['audio']):
audio['hls']['group_id'].append(index)
如果以前没有附加索引,我怎样才能只触发append
语句?
只需测试if
的索引是否not in
您的列表中:
for index, codec in enumerate(codecs):
for audio in filter(lambda x: x['hls']['codec_name'] == codec, job['audio']):
if index not in audio['hls']['group_id']:
audio['hls']['group_id'].append(index)
我认为你正在倒退,非常低效。 现在,对于每个名称,您循环遍历整个job['audio']
序列以查找匹配项。 这是 O(n^2)。
相反,您可以对coedecs
进行一次传递,以记录每一个的第一次出现:
codec_map = {codec: len(codecs) - i - 1 for i, codec in enumerate(reversed(codecs))}
反转允许您选择第一个索引而不是最后一个索引,因为字典将包含遇到的最后一个键。 如果您不在乎它是第一个还是最后一个,您可以简化:
codec_map = {codec: i for i, codec in enumerate(codecs)}
现在内部循环只需要运行一次:
for audio in job['audio']:
if audio['hls']['codec_name'] in codec_map:
audio['hls']['group_id'].append(codec_map[audio['hls']['codec_name']])
这个解决方案是 O(N),并且允许您更有效地检查事物。
只需添加
for index, codec in enumerate(codecs):
for audio in filter(lambda x: x['hls']['codec_name'] == codec, job['audio']):
if index in audio['hls']['group_id']:
pass
else:
audio['hls']['group_id'].append(index)
在list
使用in
运算符有效,但效率低于set
in
运算符。 可以使用set数据结构来提高效率:
visited_indices = set()
for index, codec in enumerate(codecs):
for audio in filter(lambda x: x['hls']['codec_name'] == codec, job['audio']):
if index not in visited_indices:
audio['hls']['group_id'].append(index)
visited_indices.add(index)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.