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

Python-通过enumerate()迭代和替换列表索引,python,csv,python-3.x,enumerate,Python,Csv,Python 3.x,Enumerate,我有一个导入CSV文件的python脚本,根据导入的文件,我有一个文件索引列表 我试图将FILESTRUCT中的索引与CSV文件匹配,然后用新生成的数据替换列中的数据。下面是一个代码剪贴: 这只是从我的fileParser方法返回的已解析CSV文件: 这是CSV列位置的列表: 这是有问题的脚本: 我已经通过在每个if语句的末尾添加print语句来验证它是否正确地将索引(idx)与FILESTRUCT中的整数匹配。那很好用 问题是,当我返回(解析)时,它并没有返回新生成的值,而是返回原始解析的输入

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

我试图将FILESTRUCT中的索引与CSV文件匹配,然后用新生成的数据替换列中的数据。下面是一个代码剪贴:

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

这是CSV列位置的列表:

这是有问题的脚本:

我已经通过在每个if语句的末尾添加print语句来验证它是否正确地将索引(idx)与FILESTRUCT中的整数匹配。那很好用

问题是,当我返回(解析)时,它并没有返回新生成的值,而是返回原始解析的输入值。我假设我可能在第二个循环中弄乱了如何使用enumerate方法,但我对enumerate方法的理解还不够透彻,无法真正了解我在这里弄乱了什么。

您可以使用

item[idx] = dataGen.firstName()
要修改基础
。这里的原因是
enumerate()
返回
(id,value)
元组,而不是对传递的iterable的引用

根据上面的示例,您甚至可能不需要
枚举
,因为您根本没有解析
lis
。所以你也可以这样做

for i in range(len(item)):
    # your if .. elif statements go here ...
    item[i] = dataGen.firstName()
另一方面,一旦您开始添加更多的条件和列,代码中的
elif
语句将变得非常笨拙。可以考虑制作<代码>文件结构>代码>字典:

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

因此,
PARSED
是一个iterable,
item
是它的一个元素,也是一个iterable,您希望通过更改
item
的元素来更改
PARSED

让我们做一个测试

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]

我们看到,
a
不会因为更改枚举元素而更改。

您没有返回更改的变量。您永远不会更改变量FILESTRUCT。而是创建另一个变量,在遍历FILESTRUCT时创建它,然后返回新文件

您不能在这样的循环中更改值,就像期望它返回所有x一样:

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

它不会,它将返回:
“一个包含一些单词的字符串”

请描述输入和输出,即
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]
demo_data = "A string with some words"
for letter in demo_data:
    letter = "x"
return demo_data