Python - 通过enumerate()迭代和替换列表索引

时间:2016-01-13 21:04:00

标签: python csv python-3.x enumerate

我有一个导入CSV文件的python脚本,根据导入的文件,我有一个文件索引列表。

我正在尝试将FILESTRUCT中的索引与CSV文件匹配,然后用新生成的数据替换列中的数据。这是一个代码片段:

这只是我从fileParser方法返回的解析后的CSV文件:

PARSED = fileParser() 

这是CSV列位置列表:

FILESTRUCT = [6,7,8,9,47]

这是有问题的脚本:

def deID(PARSED, FILESTRUCT):
    for item in PARSED:
            for idx, lis in enumerate(item):                        
                    if idx == FILESTRUCT[0]:
                           lis = dataGen.firstName()

                    elif idx == FILESTRUCT[1]:
                            lis = dataGen.lastName()

                    elif idx == FILESTRUCT[2]:
                            lis = dataGen.email()

                    elif idx == FILESTRUCT[3]:
                            lis = dataGen.empid()

                    elif idx == FILESTRUCT[4]:
                            lis = dataGen.ssnGen()

                    else:
                            continue

    return(PARSED)

我已经通过在每个if语句的末尾添加一个print语句来验证它是否正确匹配了索引(idx)和FILESTRUCT中的整数。这非常有效。

问题在于,当我返回(PARSED)时,它不会使用新生成的值返回它,而是返回原始的PARSED输入值。我假设我可能搞砸了我在第二个循环中使用枚举方法的方法,但我不太了解枚举方法,以便真正知道我在这里弄乱了什么。

3 个答案:

答案 0 :(得分:1)

您可以使用

item[idx] = dataGen.firstName()

修改基础item。这里的原因是enumerate()返回(id, value)元组而不是对您传递的迭代的引用。

鉴于上面的示例,您甚至可能不需要enumerate,因为您根本不会解析lis。所以你也可以这样做

for i in range(len(item)):
    # your if .. elif statements go here ...
    item[i] = dataGen.firstName()

另一方面,一旦开始添加更多条件和列,代码中的elif语句将变得难以处理。也许可以考虑将FILESTRUCT字典改为:

FILESTRUCT = {
    6: dataGen.firstName,
    7: dataGen.lastName,
    ....
    }
...
for idx in range(len(item)):
    if idx in FILESTRUCT.keys():
        item[idx] = FILESTRUCT[idx]()

答案 1 :(得分:0)

因此PARSED是可迭代的,item是其中的一个元素,也是可迭代的,并且您希望通过更改{{1}的元素来更改PARSED }。

所以让我们做一个测试。

item

结果是:

a = [1, 2, 3]
print 'Before:'
print a

for i, e in enumerate(a):
    e += 10

print 'After:'
print a

for e in a:
    e += 10

print 'Again:'
print a

a[0] += 10

print 'Finally:'
print a

我们看到,Before: [1, 2, 3] After: [1, 2, 3] Again: [1, 2, 3] Finally: [11, 2, 3] 不会因更改枚举元素而改变。

答案 2 :(得分:0)

您没有返回已更改的变量。您永远不会更改变量FILESTRUCT。而是创建另一个变量,在循环通过FILESTRUCT然后返回新的FILE时进行。

您不能像这样更改循环中的值,有点像期望这样可以返回所有x:

demo_data = "A string with some words"
for letter in demo_data:
    letter = "x"
return demo_data

它不会,它会返回:"A string with some words"