Python-通过enumerate()迭代和替换列表索引
我有一个导入CSV文件的python脚本,根据导入的文件,我有一个文件索引列表 我试图将FILESTRUCT中的索引与CSV文件匹配,然后用新生成的数据替换列中的数据。下面是一个代码剪贴: 这只是从我的fileParser方法返回的已解析CSV文件: 这是CSV列位置的列表: 这是有问题的脚本: 我已经通过在每个if语句的末尾添加print语句来验证它是否正确地将索引(idx)与FILESTRUCT中的整数匹配。那很好用 问题是,当我返回(解析)时,它并没有返回新生成的值,而是返回原始解析的输入值。我假设我可能在第二个循环中弄乱了如何使用enumerate方法,但我对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中的整数匹配。那很好用 问题是,当我返回(解析)时,它并没有返回新生成的值,而是返回原始解析的输入
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