1

我有两个 CSV 文件。一:

s555555,7
s333333,10
s666666,9
s111111,10
s999999,9

还有两个:

s111111,,,,,
s222222,,,,,
s333333,,,,,
s444444,,,,,
s555555,,,,,
s666666,,,,,
s777777,,,,,

我想结束:

[['s111111', '10', '', '', '', ''],
 ['s222222', '',   '', '', '', ''],
 ['s333333', '10', '', '', '', ''],
 ['s444444', '',   '', '', '', ''],
 ['s555555', '7',  '', '', '', ''],
 ['s666666', '9',  '', '', '', ''],
 ['s777777', '',   '', '', '', '']]

这是我的代码:

new_marks = get_marks_from_file('assign1_marks.csv')
marks     = get_marks_from_file('marks.csv')

def merge_marks(all_marks, new_marks, column):
    for n in range(len(new_marks)):
        for a in range(len(all_marks)):
            if all_marks[a][0]==new_marks[n][0]:
                 all_marks[a][column]= new_marks[n][column]

                return marks

我究竟做错了什么?我不断得到:

>>> merge_marks(marks, new_marks, 1)

[['s111111', '',  '', '', '', ''],
 ['s222222', '',  '', '', '', ''],
 ['s333333', '',  '', '', '', ''],
 ['s444444', '',  '', '', '', ''],
 ['s555555', '7', '', '', '', ''],
 ['s666666', '',  '', '', '', ''],
 ['s777777', '',  '', '', '', '']]
4

1 回答 1

2

线

                return marks

必须取消三个级别的缩进,以使其脱离 for 循环和 if 语句。现在它正在返回all_marks[a][0]==new_marks[n][0]它找到的第一个匹配项,并且永远不会替换其他匹配项。

您还想返回all_marks而不是marks:在这种情况下,全局变量marks恰好是相同的并且也被更改了,但是如果您使用一个字面上命名为其他任何名称的变量来调用它,它将失败。

因此解决方案是:

def merge_marks(all_marks, new_marks, column):
    for n in range(len(new_marks)):
        for a in range(len(all_marks)):
            if all_marks[a][0]==new_marks[n][0]:
                 all_marks[a][column]= new_marks[n][column]

    return all_marks
于 2012-08-29T21:55:23.290 回答