Python - 比较元组列表中的项

3

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

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]吗?


7
如果这个方法奏效并且你想获得有关代码和实现的反馈意见,你应该把它提交到代码审查。 - jacoblaw
我之前不知道这个选项,谢谢你告诉我! - nuki
2个回答

2
使用字典替代,这样你就不需要在内部循环中寻找键冲突,并将复杂度从O(m*n)降低到O(m)。

1
你可以使用字典并逐个更新项目,同时通过已经存在于字典中的版本检查版本,例如:
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) 如果 item 是一个有效的键,则返回版本,否则返回 0。 在比较之前,��可能希望将版本强制转换为 int()

编辑:

添加了 int() 类型转换 + try/except 来捕获尝试将 "" 转换为 int() 时出现的异常。


很高兴能帮到你! - Mohd
实际上,如果你想避免类型转换,你可以将它们保留为字符串。 - maxymoo
1
@maxymoo 但是如果一个版本没有前导零,事情就会混乱,因为 '4' > '11'True - Mohd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接