如何比较两个长度、顺序和重复值未知的列表中的每个项目,同时最小化写入并保留Python中的位置?

如何比较两个长度、顺序和重复值未知的列表中的每个项目,同时最小化写入并保留Python中的位置?,python,loops,Python,Loops,我保证我已经试过搜索了,但是我发现的每一个问题都有一些未说明或违反的标准,这使得答案对我来说是不够的 我正在向Python脚本发送一个列表。该列表将存储在某个地方,但我希望尽量减少写入(这是在远程服务上,每次写入都要收费) (请不要因为它们是字符串而分心;我的列表实际上包含int。) 简单的基本算法是逐个索引地迭代两个列表。如果项目是相同的,我不需要写;繁荣,省钱。然而,最终保存的数据应该是新的 在其他语言中,我可以通过索引直接引用元素 for (int i = 0; i < listNe

我保证我已经试过搜索了,但是我发现的每一个问题都有一些未说明或违反的标准,这使得答案对我来说是不够的

我正在向Python脚本发送一个列表。该列表将存储在某个地方,但我希望尽量减少写入(这是在远程服务上,每次写入都要收费)

(请不要因为它们是字符串而分心;我的列表实际上包含int。)

简单的基本算法是逐个索引地迭代两个列表。如果项目是相同的,我不需要写;繁荣,省钱。然而,最终保存的数据应该是新的

在其他语言中,我可以通过索引直接引用元素

for (int i = 0; i < listNew.length; i++) {
    // Have we exceeded the previous list's length? Time to just write data in.
    if (listPrevious[i] == null)
        listPrevious.append(listNew[i]);
        continue;

    if (listNew[i] != listPrevious[i])
        listPrevious[i] = listNew[i]
}
这将listNew中的元素与listPrevious中的每个元素进行比较,这是低效的。我只需要知道它是否与另一个列表中的相同索引匹配

-------通过评论请求

输入:2个列表,listNew和listPrevious。另一个例子

  • listNew=[10050020020010050700]
  • listPrevious=[10050020040050]
输出:listPrevious现在是listNew,无需覆盖相同的元素

listPrevious=[10050020020010050700]


  • 不需要写入:[100500200,,50,,从您的C代码我创建了以下代码。希望它能满足您的需求:

    for i in range(len(listNew)):
        # Have we exceeded the previous list's length? Time to just write data in.
        if i >= len(listPrevious):
            listPrevious.append(listNew[i])
            continue
    
        if listNew[i] != listPrevious[i]:
            listPrevious[i] = listNew[i]
    

    从您的C代码中,我创建了以下内容。希望它能满足您的需求:

    for i in range(len(listNew)):
        # Have we exceeded the previous list's length? Time to just write data in.
        if i >= len(listPrevious):
            listPrevious.append(listNew[i])
            continue
    
        if listNew[i] != listPrevious[i]:
            listPrevious[i] = listNew[i]
    

    如果要按索引顺序迭代,则需要
    枚举

    for idx, item in enumerate(mylist):
      # idx is the 0-indexed value where item resides in mylist.
    
    如果要在python中迭代成对的内容,请使用
    zip

    for a, b in zip(newlist, oldlist):
      # items a and b reside at the same index in their respective parent lists.
    
    您可以结合以下方法:

    for idx, (a, b) in enumerate(zip(newlist, oldlist)):
      # here you have everything you probably need, based on what I can 
      # tell from your question.
    

    根据您的数据集,您还可以查看
    itertools
    模块中的附加函数,特别是
    izip_longest

    ,如果您希望按所需索引的顺序进行迭代
    枚举

    for idx, item in enumerate(mylist):
      # idx is the 0-indexed value where item resides in mylist.
    
    如果要在python中迭代成对的内容,请使用
    zip

    for a, b in zip(newlist, oldlist):
      # items a and b reside at the same index in their respective parent lists.
    
    您可以结合以下方法:

    for idx, (a, b) in enumerate(zip(newlist, oldlist)):
      # here you have everything you probably need, based on what I can 
      # tell from your question.
    

    根据您的数据集,您还可以查看
    itertools
    模块中的附加功能,特别是
    izip\u longest

    项目的位置重要吗

    如果不只是这样做:

    for n in NewList:
        if n not in OldList:
            OldList.append(n)
            process(n)
    

    物品的位置重要吗

    如果不只是这样做:

    for n in NewList:
        if n not in OldList:
            OldList.append(n)
            process(n)
    

    Python的列表方法实际上提供了您认为它没有的所有功能(最后一个代码示例与示例代码相同):

  • 通过索引获取元素而不删除它的方法(pop方法)

  • 通过精确的值和位置获取元素索引的方法,因为我有重复项(在上面的代码中,使用list.index(“some”)将返回listPrevious中的第一个索引,尽管我实际上在查看listNew中的最后一个元素)

  • 在我的列表中迭代超过其中一个列表长度的方法(zip()似乎不会迭代超过较小列表的长度)


  • Python的列表方法实际上提供了您认为它没有的所有功能(最后一个代码示例与示例代码相同):

  • 通过索引获取元素而不删除它的方法(pop方法)

  • 通过精确的值和位置获取元素索引的方法,因为我有重复项(在上面的代码中,使用list.index(“some”)将返回listPrevious中的第一个索引,尽管我实际上在查看listNew中的最后一个元素)

  • 在我的列表中迭代超过其中一个列表长度的方法(zip()似乎不会迭代超过较小列表的长度)


  • 您对上述列表的预期输出是什么?我不明白为什么您认为您不能将“其他语言”代码用于python。。。这应该可以很好地工作(obv使用范围而不是您可以添加“输入:(2个列表)”和“所需输出:(?)”对于你的问题?我有点困惑…@Colleen我可以用它吗?太好了!谢谢,我会试一试,并尝试精确匹配我的其他语言代码。@Ashwini Chaudhary:我的预期输出是将listNew保存到listPrevious中,因此listPrevious应该显示listNew的元素,但不写相同的元素——在示例中在e的情况下,第一个“some”不需要写。您对上述列表的预期输出是什么?我很困惑,为什么您认为您不能将“其他语言”代码用于python…这应该可以很好地工作(obv使用范围,而不是请您添加“输入:(2个列表)”和“期望的输出:(?)”对于你的问题?我有点困惑…@Colleen我可以用它吗?太好了!谢谢,我会试一试,并尝试精确匹配我的其他语言代码。@Ashwini Chaudhary:我的预期输出是将listNew保存到listPrevious中,因此listPrevious应该显示listNew的元素,但不写相同的元素——在示例中e的案例,第一个“一些”不需要书写。是的,物品的位置很重要。谢谢!我将重新设置问题的格式来表示这一点。是的,物品的位置很重要。谢谢!我将重新设置问题的格式来表示这一点。我将试一试。在你个人看来,itertools在性能和尺寸上好吗?@Danny出于所有意图和目的,越是客观你需要处理的东西越多,itertools就越好。很高兴知道。我只是开始学习Python,因为我最近也使用了Google App Engine。谢谢!我会尝试一下。在你个人看来,itertools在性能和大小上都好吗?@Danny不管怎么说,你需要处理的对象越多,iter就越好工具越来越多了。很高兴知道。