Python比较元组列表中的项

2024-05-19 12:05:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个元组列表(项目名称,版本)-一个包含所有当前项目,另一个包含要导入的项目。如果导入的项目和当前项目之间存在名称冲突,我希望返回较新的版本。我的解决方案是:

currentItemVersion = [("ItemA", "001"), ("ItemB", "002"), ("Camera", ""), ("SHD_metal", "001"), ("SHD_wood", "002")]
importItemVersion = [("ItemB", "001"), ("Camera", "001"), ("SHD_metal", "002"), ("SHD_wood", "004")]

def updateItems(currentItems, importItems):
    updatedItems = []
    for i, v in currentItemVersion:
        if i in [n[0] for n in importItemVersion]:
            ni, nv = importItemVersion[[n[0] for n in importItemVersion].index(i)]
            nvInt = int(nv) if nv else -1
            vInt = int(v) if v else -1
            if nvInt > vInt:
                updatedItems.append((ni, nv))
            elif nvInt == vInt:
                updatedItems.append((ni, nv))
            else:
                updatedItems.append((i, v))
        else:
            print('item {0} was not imported'.format(i))
            updatedItems.append((i, v))
    return updatedItems

print(updateItems(currentItemVersion, importItemVersion))

我想知道是否有更好的解决方案,特别是在第7行和第8行。我能查一下吗

if i in [n[0] for n in list]

在一次操作中返回n[1]?你知道吗


Tags: 项目in版本forifelseniappend
2条回答

改用dict,这样您就不需要找到与内部循环冲突的键,并将复杂性从O(m*n)降低到O(m)。你知道吗

您可以使用dict并逐个更新项目,同时检查dict中已有的版本(如果可用),例如:

currentItemVersion = [("ItemA", "001"), ("ItemB", "002"), ("Camera", ""), ("SHD_metal", "001"), ("SHD_wood", "002")]
importItemVersion = [("ItemB", "001"), ("Camera", "001"), ("SHD_metal", "002"), ("SHD_wood", "004")]

def updateItems(currentItems, importItems):
    updated = {}
    for item, ver in currentItems + importItems:
        try:
            if int(ver) > int(updated.get(item, 0)):
                updated[item] = ver

        except ValueError:
            updated[item] = ver

    return updated

print updateItems(currentItemVersion, importItemVersion)

输出:

{'ItemB': '002', 'ItemA': '001', 'Camera': '001', 'SHD_wood': '004', 'SHD_metal': '002'}

dict.get(item, 0)如果项是有效键,则返回version;如果不是,则返回0。 在比较之前,您可能需要将转换版本键入int()。你知道吗

编辑:

添加了int()type cast+try/except以在尝试将""类型转换为int()时捕获异常

相关问题 更多 >

    热门问题