【问题标题】:How to transform a list to string conditioned by the type of the list element如何根据列表元素的类型将列表转换为字符串
【发布时间】:2021-02-18 22:54:51
【问题描述】:

我有一个要转换为单个字符串的字符串列表。

该列表包含我不想用空格分隔它们的整数。

例如我有一个列表:

lst = ['This', 'house', 'has', 1, 2, 'rooms']

我用来制作字符串的方式是:

' '.join([str(elem) for elem in lst])

这当然会导致:'This house has 1 2 rooms'

目的是得到:'这房子有12个房间'

我不确定如何根据列表元素的类型从上面调整 join 语句,以便在它是字符串时有空格,如果是空字符串是一个整数。

有什么建议吗?

【问题讨论】:

  • 首先不要分开数字?
  • @super rain 谢谢你的建议。但是,我无法更改输入,这样的列表就是我收到的。
  • 为什么会这样收到?
  • 这就是句子的分隔方式。我无法更改该操作,因此我必须修复其结果。
  • 或者您可以将其报告为错误。

标签: python python-3.x string list


【解决方案1】:

itertools分组:

>>> ' '.join(('' if t is int else ' ').join(map(str, g))
             for t, g in groupby(lst, type))
'This house has 12 rooms'

【讨论】:

  • 谢谢@superb rain 这也有效!我将不得不更好地研究 itertools 的功能
【解决方案2】:

可能是过度设计的解决方案,但它是:

' '.join(filter(lambda y: (y != ''), ((''.join([str(' '+x+' ') if type(x) is str else str(x) for x in lst])).strip().split(' '))))

说明:

  1. 检查elem的类型,如果是str,则前加一个空格,后加一个空格,并使用strip()去除前导和结尾空格
  2. 这会给你'This house has 12 rooms'
  3. 如您所见,有些元素有两个空格,所以我们用空格分割列表。我们得到['This', '', 'house', '', 'has', '12', 'rooms']
  4. 我们从列表中过滤掉空格。我们会通过这个过滤器得到这个列表。 ['This', 'house', 'has', '12', 'rooms']
  5. 我们通过单个空格加入列表。

它将给出以下输出:

'This house has 12 rooms'

【讨论】:

    【解决方案3】:

    您可以先连接字符串,然后删除数字之间的空格:

    lst = ['This', 'house', 'has', 1, 2, 'rooms']
    s = ' '.join([str(elem) for elem in lst])
    re.sub(r"(?<=\d) (?=\d)", "", s)
    

    它给出:

    'This house has 12 rooms'
    

    【讨论】:

    • 我也试图用正则表达式来做,但我无法语法化它
    • 如果可能,您能否详细说明/确认我对正则表达式的解释的理解? sub 方法执行第一个参数,您在字符串 s 中搜索模式,当您找到它时,您将替换为空字符串。现在,正则表达式本身(模式)是: ?= 标识下一个元素是否为数字。从文档中我无法理解?
    • (?=\d) 是超前的 - 它检查下一个字符是否是数字。反过来(?&lt;=\d) 是lookbehind,它检查前一个字符是否是数字。如果两边都有数字,(?&lt;=\d) (?=\d) 将匹配空格字符。 re.sub 用空字符串替换每个这样的空格字符。
    【解决方案4】:

    "".join(" " + elem + " " if isinstance(elem, str) else str(elem) for elem in list).replace(" ", " ").strip()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多