【问题标题】:Using conditionals with variable strings in python在python中使用带有变量字符串的条件
【发布时间】:2012-04-12 08:28:56
【问题描述】:

我对 python 还很陌生,但我认为我很快就掌握了。

无论如何,我正在制作一个程序(不是为了上课,而是为了帮助我)并且遇到了一个问题。

我正在尝试记录一个事物列表,我的意思是接近一千个事物,其中一些是重复的。所以我的问题是这样的:

我不想在列表中添加多余的名称,而是只想在它之前(或之后,以更简单者为准)添加 2x 或 3x,然后将其写入 txt 文档。

我对文本文档的读写很好,但我唯一的问题是条件语句,我不知道怎么写,网上也找不到。

for lines in list_of_things:
   if(lines=="XXXX x (name of object here)"):

然后是 if 语句下的任何内容。我唯一的问题是“XXXX”可以替换为任何字符串编号,但我不知道如何在字符串中包含变量,如果这有意义的话。即使变成int,我还是不知道如何在条件中使用变量。

我唯一能想到的就是制作多个 if 语句,这会很长。

有什么建议吗?我为文字墙道歉。

【问题讨论】:

  • 澄清一下,你是说你有一个可能有冗余行的源,最终你想输出带有计数前缀的唯一行吗?另外,顺序重要吗?

标签: python variables if-statement conditional


【解决方案1】:

我建议遍历输入文件中的行并在字典中为您找到的每行插入一个键,然后为您之后找到的每个值实例将键处的值递增 1,然后生成您的从该字典输出文件。

catalog = {}
for line in input_file:
    if line in catalog:
        catalog[line] += 1
    else:
        catalog[line] = 1

或者

from collections import defaultdict
catalog = defaultdict(int)
for line in input_file:
    catalog[line] += 1

然后只需运行该字典并将其打印到文件中。

【讨论】:

  • 我想这就是他要问的。和我要建议的一样。
  • @NolenRoyalty:最终我会建议这样做,但在首先解释标准字典方式之后,它应该是一个附加信息,因为他是一个新的 python 程序员。
  • @jdi 很公平,无论哪种方式,解决方案都是正确的(假设我们已经正确理解了这个问题)。
  • 是的,这就是我要问的。我不得不查字典,但我明白了。看起来很简单,感谢您的及时回复!我想我只是以错误的方式接近它。
  • @user1298844:一旦您觉得自己了解字典,就应该按照 Nolen Royalty 的建议查找 defaultdict。它使这个计数器更简单一些,因为它总是会生成一个全新的键 == 0
【解决方案2】:

有两种方法可以解决这个问题。 1) 类似下面的内容,使用字典来捕获项目的数量,然后使用列表来格式化每个项目的数量

list_of_things = ['sun', 'moon', 'green', 'grey', 'sun', 'grass', 'green']
listItemCount = {}
countedList = []
for lines in list_of_thing:
    if lines in listItemCount:
        listItemCount[lines] += 1
    else:
        listItemCount[lines] = 1
for id in listItemCount:
    if listItemCount[id] > 1:
        countedList.append(id+' - x'str(listItemCount[id]))
    else:
        countedList.append(id)
for item in countedList:
    print(item)

上面的输出是

sun - x2
grass
green - x2
grey
moon

或 2) 使用集合使事情变得更简单,如下所示

import collections

list_of_things = ['sun', 'moon', 'green', 'grey', 'sun', 'grass', 'green']
listItemCount = collections.Counter(list_of_things)
listItemCountDict = dict(listItemCount)
countedList = []
for id in listItemCountDict:
    if listItemCountDict[id] > 1:
        countedList.append(id+' - x'str(listItemCountDict[id]))
    else:
        countedList.append(id)
for item in countedList:
    print(item)

上面的输出是

sun - x2
grass
green - x2
grey
moon

【讨论】:

    【解决方案3】:

    应该这样做:

    a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
    from itertools import groupby
    print ["%dx %s" % (len(list(group)), key) for key, group in groupby(a)]
    

    【讨论】:

    • 尤其是 OP 被承认是一个新的 python 程序员,你应该对这个答案不那么晦涩。
    • 他说他抓得很快 :) 呵呵,如果这太高级了,我很抱歉,我只是希望它对 OP 有所帮助,但请记住,这是一个公共问答,不是初学者的人可能会稍后再来。
    • 好吧,如果您要建议一些高级的东西,至少要修复它,使其不使用常量字符串连接:["%dx %s" % (len(list(group)), key) for key, group in groupby(a)]
    • @jdi 也许我在上一条评论中听起来像个聪明人?我不是想成为其中的一员。我只是想帮忙。好建议顺便说一句,我已经编辑了。
    • 这其实很有趣。不幸的是,我正在上的课相当慢。我明白了这一点,并且正在与 groupby 一起玩更多,以了解您是如何做到的。谢谢!
    【解决方案4】:

    要在字符串中包含变量,请使用format()

    >>> 我 = 123 >>> s = "这是一个例子 {0}".format(i) >>> s '这是一个例子 123'

    在这种情况下,{0} 表示您要在其中放置一个变量。如果您有更多变量,请使用"This is an example {0} and more {1}".format(i, j)"(因此每个变量都有一个数字,从0 开始)。

    【讨论】:

      【解决方案5】:

      这样的?

      list_of_things=['XXXX 1', 'YYYY 1', 'ZZZZ 1', 'AAAA 1', 'ZZZZ 2']
      
      for line in list_of_things:
          for e in ['ZZZZ','YYYY']:
              if e in line:
                  print line
      

      输出:

      YYYY 1
      ZZZZ 1
      ZZZZ 2
      

      您也可以使用if line.startswith(e): 或正则表达式(如果我理解您的问题...)

      【讨论】:

        【解决方案6】:

        您可能正在寻找regular expressions 之类的东西

        for line in text:
            match = re.match(r'(\d+) x (.*)', line)
            if match:
                count = int(match.group(1))
                object_name = match.group(2)
                ...
        

        【讨论】:

        • 我感觉 OP 显示的模式确实是一种想要计算行数的尴尬方法,并且他在摄取这些字符串时已经预先格式化了这些字符串,然后想要重新解析它们。
        猜你喜欢
        • 1970-01-01
        • 2012-10-11
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 2018-01-07
        • 2021-09-27
        • 2013-03-08
        • 1970-01-01
        相关资源
        最近更新 更多