繁体   English   中英

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

[英]Python - Iterating and Replacing List Index via 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输入值。 我以为我可能在第二个循环中弄乱了如何使用枚举方法,但是我对枚举方法的理解不够充分,以至于无法真正知道自己在这里搞砸了什么。

您可以使用

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]()

因此, PARSED是可迭代的, item是它的元素,也是可迭代的,您想通过更改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时返回它,然后返回新的FILE。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM