【问题标题】:Concatenate string elements in a list on the basis of delimiters根据分隔符连接列表中的字符串元素
【发布时间】:2019-03-28 21:43:31
【问题描述】:

我正在尝试根据一些分隔符组合列表中的所有元素;当分隔符对超过 1 时,我遇到了困难。

说这是列表:

['{','k0c','k1b','k2b','k3b','}','{','\\g0','\\g1','\\g2','\\g3','}']

此列表中有 12 项

每当它找到 '{' 和 '}' 时,我希望将这些索引中的所有元素连接成一个,以便:

['{ k0c, k1b, k2b, k3b }' , '{\\g0 , \\g1, \\g2, \\g3 }' ]

此列表中的 2 项是我想要的,将分隔符内的所有元素都变成列表的一个元素。

【问题讨论】:

  • 可以嵌套对吗?
  • 能否请您通过嵌套详细说明?您是在说列表列表吗?
  • 意思是在一个左大括号之前总是跟着一个右大括号?或者你能有类似["{", "a", "{", "b", "}", "c", "}"]的东西吗?
  • 哦不..我不会有任何嵌套的括号。谢谢。

标签: python python-2.7 parsing delimiter


【解决方案1】:

这样的事情应该可以解决问题:

input_data = [
    "{",
    "k0c",
    "k1b",
    "k2b",
    "k3b",
    "}",
    "{",
    "\\g0",
    "\\g1",
    "\\g2",
    "\\g3",
    "}",
]
lists = []
current_list = None

for atom in input_data:
    if atom == "{":
        assert current_list is None, "nested lists not supported"
        current_list = []
        lists.append(current_list)
    elif atom == "}":
        current_list.append(atom)
        current_list = None
        continue
    assert current_list is not None, (
        "attempting to add item when no list active: %s" % atom
    )
    current_list.append(atom)

for lst in lists:
    print(" ".join(lst))

输出是

{ k0c k1b k2b k3b }
{ \g0 \g1 \g2 \g3 }

但是你可以对字符串列表做任何你喜欢的事情。

【讨论】:

  • 输出应该是:{ k0c, k1b, k2b, k3b } { \g0, \g1, \g2, \g3 }
  • 如前所述,您可以对列表做任何您喜欢的事情,例如', '.join(lst),如果您需要逗号。
【解决方案2】:

假设您的数据没有任何退化案例,我们将始终期望 '}','{' 来分隔您的组。

因此,获得所需输出的一种简单方法是将字符串连接在一起,在 } 上拆分,然后格式化生成的列表元素。

l = ['{','k0c','k1b','k2b','k3b','}','{','\\g0','\\g1','\\g2','\\g3','}']
out = [x.replace("{,", "{").strip(", ") + " }" for x in ", ".join(l).split("}") if x]
print(out)
['{ k0c, k1b, k2b, k3b }', '{ \\g0, \\g1, \\g2, \\g3 }']

【讨论】:

  • 我能否详细说明一下“for x in”和“if x”部分在这一行中的作用? @pault
  • 如果有多个 { } { } { } { } 这段代码会为所有这些都做吗?我仍然无法弄清楚为什么 if 存在。
  • @zaki if 在那里处理最终的}。最好的理解方法是尝试有无。逐个尝试-首先是join,然后是split,等等...
猜你喜欢
  • 2011-04-30
  • 2011-08-18
  • 2021-11-30
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多