【问题标题】:Find a matching string and then + 1 to element找到一个匹配的字符串,然后 + 1 到元素
【发布时间】:2018-07-28 07:52:00
【问题描述】:

我正在尝试创建一个循环来遍历一个二维列表,如果循环找到第一个元素中的匹配字符串,那么它会将 +1 添加到列表的第二个元素。

列表示例:

[[mike, 0], [john, 2], [henry, 0], [sam, 1]]

如果所需的搜索是约翰,这将发生:

[[mike, 0], [john, 3], [henry, 0], [sam, 1]]

然后是迈克:

[[mike, 1], [john, 3], [henry, 0], [sam, 1]]

在下面的场景中,'name' 是需要找到的字符串。

我还从 CSV 文件中提取名称列表,然后将更新后的列表写回。

我似乎无法让它工作,并且返回给我的错误是

'TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是'list''

def count(name):
    with open('nameList.csv', 'r') as csvfile:
        reader = csv.reader(csvfile)
        nameList = list(reader)
    for x in range(len(nameList)):
        if nameList[x][0] == name:
            print(nameList== name)
            nameList[1] = nameList[1] + 1
    with open("nameList.csv", "w", newline='') as f:
        writer = csv.writer(f)
        for i in nameList:
            writer.writerow(i)

关于如何使它工作的任何想法?非常感谢!

【问题讨论】:

    标签: python arrays list loops csv


    【解决方案1】:


    我相信您要解决的原始问题是获取名称的计数。

    如果是这样,那么使用 Python 的 collections 模块中的 Counter 可以更轻松地完成。

    from collections import Counter
    
    cnt = Counter()
    with open("nameList.csv", 'r') as f:
        rd = csv.reader(f)
        cnt = Counter(r[0] for r in rd)
    
    print(cnt)
    


    cnt 将是类似字典的对象(您可以像使用任何其他字典一样使用它),其中键是 CSV 中的名称,值是计数。所以,它可能看起来像这样:

    {'john': 3, 'mike': 1, 'sam': 1}
    


    现在假设您有另一个包含名称的 CSV,并且您想要查找两个文件中每个名称的计数。您可以通过更新cnt 轻松做到这一点:

    with open("nameList2.csv", 'r') as f:
        rd2 = csv.reader(f)
        cnt.update(r[0] for r in rd2)
    

    您避免从头开始计数并且代码更性感!简洁大方!

    【讨论】:

    • 您好,感谢您的回复!我只是快速运行了一下,我只希望每次都将 +1 添加到函数中的特定名称,而不是所有名称。但是,您向我展示了很棒的东西,老实说,它解决了我试图解决的完全不同的问题!谢谢
    • 我添加了一些可能对您有帮助的信息
    • 现在整理得很棒,感谢您抽出宝贵时间提供帮助!
    • 很高兴为您服务。 :)
    【解决方案2】:

    突出的一件事是这一行:

     nameList[1] = nameList[1] + 1
    

    nameList[1] 是主列表中的第二个内部列表。我想你的意思可能是nameList[x][1]

    nameList[x][1] = nameList[x][1] + 1
    

    【讨论】:

    • 我刚刚编辑了我的代码来执行此操作,但是它返回了这个'TypeError:只能将列表(而不是“int”)连接到列表',我觉得可能类似于原始问题?谢谢!
    • nameList 中究竟包含什么?在我的测试中,我使用了nameList = [['mike', 0], ['john', 2], ['henry', 0], ['sam', 1]],当我尝试我建议的修复时,它起作用了。无论如何,听起来 nisemonoxide 为您提供了一种更简洁的方式来获取您需要的数据,我建议您这样做而不是我的建议。
    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2014-02-11
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多