Python:如果在一列中匹配的Dictionary键替换,则另一列具有值

时间:2012-08-09 14:22:18

标签: python csv

这里简单的问题,我有

  • 字典twodee,其中waternumbers为键,停留时间为值
  • 当waternumber匹配第二列中的值时(line.split()[1])我想用file +的值覆盖fileName2第9列中的值

我现在已经尝试了半个小时了,发布它似乎有点基础,但也许将来会帮助其他人。

twodee = dict(zip(waternumber, residencetime))


with open(fileName2, "r") as otherinput:
    try:
        for line in otherinput:
            for waternumber, residencetime in twodee.iteritems():
                line.split()[1] == waternumber
                line.split()[9] = residencetime
    except:
        pass

非常感谢!

2 个答案:

答案 0 :(得分:2)

您没有将.split()的结果分配给任何内容,也没有正确测试。此外,您根本不需要遍历您的twodese dict,只需使用waternumber运算符测试dict中是否存在in值:

for line in otherinput:
    line = line.split()
    waternumber = int(line[1])
    if waternumber in twodee:
        line[9] = twodee[waternumber]
    print line

最后但并非最不重要的一点是,您希望实际使用更改的行执行某些操作,此处我将其打印出来。

详细说明一下,你的两行.split()是最终无所作为的行动:

            line.split()[1] == waternumber
            line.split()[9] = residencetime

第一个操作将行拆分为列表,选择第一个元素并测试它是否等于waternumber值。这可能是TrueFalse,但您不会做任何事情而不是布尔值。它只是被删除,python没有对它采取行动,并且无论如何都会执行下一行。

第二个操作再次将该行拆分为一个列表,选择第9个元素,并将其替换为residencetime的值。但是,line.split()的结果并没有神奇地改变list的值,它返回一个列表,在这种情况下,它不会被分配给任何内容,因此又掉了。

答案 1 :(得分:2)

您的一些建议代码:

  1. 当不指定或多或少的特定异常时,请不要使用try-except(仅指定您希望发生的异常)。你在try-except中有错误,它们都是默默传递的。
  2. 您的替换对您没有帮助,因为您不以任何有意义的方式存储结果(您只需更改在每次下一次迭代时丢失的迭代变量
  3. line.split()[1] == waternumber不是作业,而是比较,此行被评估为表达式,结果会进一步丢失。
  4. .split()的结果是一个全新的列表对象,其项目已更改;这个新对象进一步消失(见2)。