【问题标题】:Python - looping multiple lists with enumerate for same indexPython - 使用枚举循环多个列表以获取相同的索引
【发布时间】:2016-02-11 07:57:03
【问题描述】:
    list1 = Csvfile1._getRow(' field1')
    list2 = Csvfile2._getRow(' field1')

    _list1 = Csvfile1._getRow(' field2')
    _list2 = Csvfile2._getRow(' field2')


    for i,(a,b) in enumerate(zip(list2, list1)):

        value = False
        if field == ' field1':
            for j,(c,d) in enumerate(zip(_list2, _list1)):
                if i == j:
                    if a != b and c != d:
                        value = True
                    else:
                        value = False
                    break
        if value == True:
            continue

        if a != b
            # do something    

以下是示例: 比较两个 csv 文件中的值。当 field1 的值 在两个 csv 文件中不相等,条件 if a != b: 应该被执行。

当两个 csv 文件中 field1 的值不相等时,同时如果 field2 的值也不相等 -> 则不应执行条件 if a != b:。

对于庞大的数据,这似乎行不通。还是有更好的方法来实现这一点?

Csvfile1

字段1 |字段2

222 | 4 -> 输入 if a != b: 条件循环

435 | 5 -> 如果 a != b: 条件循环则不要输入

Csvfile2

字段1 |字段2

223 | 4

436 | 6

【问题讨论】:

  • field 设置在哪里?
  • 让我们假设代码是:list1 = Csvfile1._getRow(field) list2 = Csvfile2._getRow(field1)。字段作为参数传递给此函数。
  • 仅在比较该特定字段的值时 - 需要此“额外检查”。对于其他字段,直接比较,不相等则执行a!=b条件

标签: python csv for-loop enumerate


【解决方案1】:

如果我做对了你想做的事,试试这样的:

$ cat t1.txt
field1|field2
222|4
435|5

$ cat t2.txt
field1|field2
223|4
436|6

$ python
import csv
with open("t1.txt", "rb") as csvfile:
  with open("t2.txt", "rb") as csvfile2:
    reader = csv.reader(csvfile, delimiter='|')
    reader2 = csv.reader(csvfile2, delimiter='|')
    for row1, row2 in zip(reader, reader2):
      for elem1, elem2 in zip(row1, row2):
        if elem1 != elem2:
          print "different: {} and {}".format(elem1, elem2)
different: 222 and 223
different: 435 and 436
different: 5 and 6

【讨论】:

  • 感谢您的回复。让我解释一下:不同:222 和 223:对于这一行 -> field1 的值不相等。 field2(4 和 4)值相等。因此在我的代码中比较时这将进入 a!=b 条件。 不同:435 和 436 :对于这一行 -> field1 的值不相等。 field2(5 和 6)的值也不相等。因此,在我的代码中,在比较过程中,它不会进入 a!=b 条件并且什么也不做。
【解决方案2】:
#first field(ff) second field(sf) first file(ff) second file(sf)
field1csv1 = Csvfile1._getRow(' field1')
field1csv2 = Csvfile2._getRow(' field1')

field2csv1 = Csvfile1._getRow(' field2')
field2csv2 = Csvfile2._getRow(' field2')

每当您拥有大量数据列表时,您都应该考虑使用生成器而不是列表推导式。 itertools.izipzip 的生成器版本。

插入它应该会给您带来相当大的改进,因为不会生成临时列表:

from itertools import izip
for i, (a, b) in enumerate(izip(list2, list1)):

        value = False
        if field == ' field1':
            for j, (c, d) in enumerate(izip(_list2, _list1)):
                if i == j:
                    if a != b and c != d:
                        value = True
                    else:
                        value = False
                    break
        if value == True:
            continue

        if a != b
            # do something  

这是一个示例,说明如何重构代码以摆脱 python 中的迭代并将迭代降到 C 级别:

#orig
for i, (a, b) in enumerate(zip(list2, list1)):
    value = False
    if field == ' field1':
        for j, (c, d) in enumerate(zip(_list2, _list1)):
            if i == j:
                if a != b and c != d:
                    value = True
                else:
                    value = False
                break

使用生成器:

from itertools import izip
mygen = izip(izip(list2,list1),izip(_list2,_list1))
#[((a, b), (c, d)), ((x, y), (_x, _y)), ...]
values = [tuple1[0]!=tuple1[1] and tuple1[2]!=tuple2[1] for tuple1, tuple2 in mygen]

您也可以使用“平等”生成器:

field1 = izip(field1csv1, field1csv2)
field2 = izip(field2csv1, field2csv2)

field1equal = (f[0] == f[1] for f in field1)
field2equal = (f[0] == f[1] for f in field2)

我走了这么远,然后放弃了。我不知道你在做什么。

【讨论】:

  • 注意:您可以通过from future_builtins import zip 直接将zip 替换为基于Py3 迭代器的版本。我稍微喜欢它而不是使用izip,因为它可以更容易地编写交叉兼容的代码。遗憾的是,需要包裹在 try:/except ImportError: pass 中,因为 future_builtins 在 Py3 中不存在。
  • 我现在使用 izip 运行代码。它有所改善,但不是很多。我不确定如何在我的代码中使用它生成器。你能帮忙吗?
  • 我试图重构你的代码,但我放弃了。我不够了解你的问题。你能试着用更笼统的术语来描述你的问题吗?
  • 使用 enumerate(izip(..., 只是有相当大的提升。有没有更好的方法来提高效率?
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 2015-09-07
  • 2022-08-09
  • 1970-01-01
相关资源
最近更新 更多