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

2024-10-01 09:33:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个导入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中的整数匹配。这很管用。你知道吗

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


Tags: 文件csv数据方法脚本列表forparsed
3条回答

你可以用

item[idx] = dataGen.firstName()

修改底层的item。这里的原因是enumerate()返回(id, value)元组,而不是对您传递的iterable的引用。你知道吗

在上面的例子中,您甚至可能不需要enumerate,因为您根本不解析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]()

您没有返回已更改的变量。您永远不会更改变量FILESTRUCT。而是在循环执行FILESTRUCT时生成另一个变量,然后返回新文件。你知道吗

你不能像那样改变循环中的值,就像期望它返回所有的x:

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

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

所以PARSED是iterable,item是iterable的一个元素,也是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并不是通过改变枚举元素来改变的。你知道吗

相关问题 更多 >