【问题标题】:How to Split a delimiter string and store it as array in python? [closed]如何拆分分隔符字符串并将其存储为python中的数组? [关闭]
【发布时间】:2016-03-03 16:37:01
【问题描述】:

我的 json 与此类似:

{"Details": {
  "id": "1423",
  "StudentName": "xxxx",
  "Joineddate" : "yyy",
  "Personalinfo" : yyyy,ZZZZ,(xxx|pppp),rrrr

}}

我想将它存储为类似于这个的数组

[0] -->  yyyy
[1] -->  ZZZZ
[2]
    [0] ---> xxx
    [1] ---> pppp
[3]  --> rrrr

当它只有一个分隔符即逗号(,)时,我可以使用以下代码来实现:

List = input.split(",")
lst = []
for var in List:
    lst.append(var)
    l_dict = json.loads(json.dumps(lst))

但我不知道如何实现?

谁能帮我解决这个问题?

【问题讨论】:

  • 你给了我们一个模棱两可的例子和一个毫无意义的代码片段。这里没有什么可做的。
  • 不是复杂的json结构。 @tdelaney
  • 如果是这样解析会更容易 - 您只需将其发送到 JSON 解析器即可。即使强制执行有效的 Python 语法,例如 "'yyyy','ZZZZ',('xxx','pppp'),'rrrr'" 也可以,因为您可以将其发送到 ast.literal_eval()
  • 你已经实质性地改变了这个问题。适用于先前版本的答案可能不适用于当前版本,反之亦然。与其这样做,不如提出一个新问题。

标签: python arrays json


【解决方案1】:

假设你只有一层嵌套并且模式完全匹配你可以使用

lst = map(lambda x: x[1:-1].split('|') if x[0] == '(' and x[-1] == ')' else x, input.split(','))

它本质上将第一个split 的数组作为输入,并通过| 再次查找括号和splits

【讨论】:

  • 我们不能断定大括号会出现在特定位置。它可能会出现在任何地方
  • “大括号”是指括号还是有更多类型?有很多组括号吗?它们能筑巢吗?
  • 那我建议你按照TigerhawkT3的建议去
  • 大括号是括号。实际上只有一种括号出现@tdelaney
【解决方案2】:

虽然我的答案是针对这个输入 123,456,(753,862),487 版本的问题,但现在似乎有一个编辑并且正在恢复为原始版本。

这可能会给你一个你想要的结构

>>> map(lambda x : float(x) if "(" not in x else map(float,x.strip("()").split(",")) ,re.findall("(\d+\.\d+|\(\d+,\d+\)|\(\d+\.\d+,\d+\.\d+\)|\d+)","123.123,456,(753,862),(123.2,234.5),487"))
[123.123, 456.0, [753.0, 862.0], [123.2, 234.5], 487.0]

否则你可以简单地使用

import ast
lst=list(ast.literal_eval("123,456,(753,862),487"))

你会得到这样的结构。

[0] -->  123
[1] -->  456
[2]
[3]  [0] ---> 753
[3]  [1] ---> 862
[4]  --> 487

【讨论】:

  • 请注意,这不适用于给定的示例输入,其中包含未用引号括起来的字符串。 ast.literal_eval() 不适用。
  • 不仅如此,而且您的第一个方法被硬编码为仅适用于数字 - 并且仅适用于整数。您认为“个人信息”成为一堆整数的可能性有多大?
  • @TigerhawkT3 。我不明白你想说什么。如果示例输入是 "123,456,(753,862),487",则 lst=list(ast.literal_eval("123,456,(753,862),487")) 有效。
  • 但这不是问题中给定的示例输入。您正在回答一个与所提问题不同的问题 - 一个更简单的问题。
  • 看起来这个问题被大量编辑了。您的答案适用于新版本,但不适用于旧版本 - 但是,现有答案适用于旧版本但不适用于新版本。由于这些类型的编辑否定了问题的价值,我已将其回滚到原始版本。如果 OP 提出了一个非常适合此答案的新问题,我鼓励您在该新问题上发布此答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2016-07-05
  • 2010-11-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多