繁体   English   中英

仅在尚未附加项目时附加?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM