我有两个元组列表(项目名称,版本) - 一个包含所有当前项目,另一个包含要导入的项目。如果导入的项目和当前项目之间存在名称冲突,我想返回较新的版本。我的解决方案是:
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行和第7行。我可以以某种方式检查
if i in [n[0] for n in list]
并在一次操作中返回n [1]?
答案 0 :(得分:2)
使用dict代替,这样你就不需要找到内环的键冲突,并将复杂度从O(m * n)降低到O(m)。
答案 1 :(得分:1)
您可以使用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'}
如果item是有效密钥,则 dict.get(item, 0)
返回版本,如果不是,则返回0
。
在比较之前,您可能希望将转换版本键入int()
。
编辑:
添加int()
类型广告+ try/except
,以便在尝试将广告""
输入int()