【问题标题】:Isolating specific elements held within brackets of a list- Python隔离列表括号内的特定元素-Python
【发布时间】:2020-10-08 10:51:38
【问题描述】:
ini_list = "[('G 05', 'Over-Speed', '1.63'), ('Load 23A_UF', '11.37'), ('Load 21A_UF', '11.38'), ('Load 08A_UF', '11.38'), ('Load 07A_UF', '11.38'), ('Load 12A_UF', '11.38'), ('Load 24A_UF', '11.38'), ('Load 15A_UF', '11.38'), ('Load 16A_UF', '11.38'), ('Load 04A_UF', '11.38'), ('Load 03A_UF', '11.38'), ('Load 18A_UF', '11.38'), ('Load 25A_UF', '11.38'), ('Load 27A_UF', '11.39'), ('Load 26A_UF', '11.39')]"
res = ini_list.strip('[]')
print(res)
('G 02', 'UV', '2.73')

result = res.strip('()')
print(result)
'G 02', 'UV', '2.73'

我有一个包含三个元素的列表,包含在括号中,我想从括号中提取每个元素并为其分配一个变量:('G 02', 'UV', '2.73'), ('Load 08A_UF ', '11.38') 等等等等,我想将变量分配给这个列表,结果如下: 括号内的第一个参数应该=元素 在某些情况下可能为空的第二个参数应该 = 原因 第三个参数总是一个数字,如果没有理由放在括号内,可能在第二个位置应该=时间。

因此结果应该如下所示:

元素 = G 05,加载 23A_UF,加载 21A_UF...列出的每个括号的第一个元素。 原因 = Over-Speed, , , 括号中不是数字的第二个元素 Time = 1.63, 11.37, 11.38,括号中的第三个元素是一个数字(总是一个数字) 我有许多列表,其中包含我以后想用来绘制各种事物的参数,因此我想从列表中提取每个参数并将其与特定变量相关联。 ini_list 中括号的数量各不相同,因此希望有一个循环。

我尝试在 Prathamesh Jadhav 的帮助下做到这一点:

ini_list = "[('G 05', 'Over-Speed', '1.63'), ('Load 23A_UF', '11.37'), ('Load 21A_UF', '11.38'), ('Load 08A_UF', '11.38'), ('Load 07A_UF', '11.38'), ('Load 12A_UF', '11.38'), ('Load 24A_UF', '11.38'), ('Load 15A_UF', '11.38'), ('Load 16A_UF', '11.38'), ('Load 04A_UF', '11.38'), ('Load 03A_UF', '11.38'), ('Load 18A_UF', '11.38'), ('Load 25A_UF', '11.38'), ('Load 27A_UF', '11.39'), ('Load 26A_UF', '11.39')]"

res = ini_list.strip('[]')

result = res.strip('()')

result1 = result.split(',')

result1=[x.strip(" ") for x in result1]
result1=[x.strip("''") for x in result1]

element = result1[0]
print("element:",element)
reason =result1[1]
print("reason:",reason)
time=result1[2]
print("time:",time)

但是,这仅适用于第一个括号,并且不会循环遍历整个括号列表,因此需要循环。但是当我尝试使用循环时,我无法摆脱括号和标点符号来隔离每个变量。

我如何得到它,所以它为上面提到的每个参数分配变量,所以它打印出来:

element = G 05, Load 23A_UF, Load 21A_UF, G 02 
reason = Over-Speed, , ,UV
time = 1.63, 11.37, 11.38, 2.73

【问题讨论】:

  • 你在找ast.literal_eval
  • 如果你把所有的'('改成'[',把')'改成']',把'改成",你可以用json解析。跨度>

标签: python list loops split strip


【解决方案1】:

是否有必要将列表作为字符串而不是列表?

ini_list = [('G 05', 'Over-Speed', '1.63'), ('Load 23A_UF', '11.37'), ('Load 21A_UF', '11.38'), ('Load 08A_UF', '11.38'), ('Load 07A_UF', '11.38'), ('Load 12A_UF', '11.38'), ('Load 24A_UF', '11.38'), ('Load 15A_UF', '11.38'), ('Load 16A_UF', '11.38'), ('Load 04A_UF', '11.38'), ('Load 03A_UF', '11.38'), ('Load 18A_UF', '11.38'), ('Load 25A_UF', '11.38'), ('Load 27A_UF', '11.39'), ('Load 26A_UF', '11.39')]

for thing in ini_list:
    if len(thing) == 3:
        element = thing[0]
        reason = thing[1]
        time = thing[2]
    else:
        element = thing[0]
        time = thing[1]
        reason = ""
    print(f"{element} {reason} {time}")

如果您可以使用ini_list 作为列表而不是字符串,则可以使用。

编辑:因为ini_list 是作为字符串给出的。您可以尝试使用正则表达式。

import re


ini_list = "[('G 05', 'Over-Speed', '1.63'), ('Load 23A_UF', '11.37'), ('Load 21A_UF', '11.38'), ('Load 08A_UF', '11.38'), ('Load 07A_UF', '11.38'), ('Load 12A_UF', '11.38'), ('Load 24A_UF', '11.38'), ('Load 15A_UF', '11.38'), ('Load 16A_UF', '11.38'), ('Load 04A_UF', '11.38'), ('Load 03A_UF', '11.38'), ('Load 18A_UF', '11.38'), ('Load 25A_UF', '11.38'), ('Load 27A_UF', '11.39'), ('Load 26A_UF', '11.39')]"

#extract all tuples by regular expression
result = re.findall(r'\((.*?)\)',ini_list)

target_list = []
for tup in result:
    items = tup.split(',')
    if len(items) == 3:
        target_list.append((item[0], item[1], item[2]))
    else:
        target_list.append((item[0], None, item[1]))

【讨论】:

  • 是的,它需要是一个字符串,我想将该字符串分成组以列出一个列表,并使这些组成为(错误)、(错误)等,每个组都是(元素, reason, time), (element, reason, time) 因此将每个括号放入一个列表中,以便我可以循环列表并从每个括号中提取元素、原因和时间。
  • 抱歉,还有一件事。我基本上是在尝试使用逗号分割字符串,以便字符串只在括号之间分割。
  • 我更新了我的答案以满足这些要求。希望它有所帮助:)
  • 非常感谢,非常感谢:))。有没有办法打印(项目)而不将它包含在[]之间?所以它只是一个纯粹的列表?
  • print(f"({item[0], item[1], item[2]})") 应该可以解决问题。它将打印:(element, reason, time)。注意只有在有 3 个元素时才使用它。否则它将引发IndexError
【解决方案2】:

这是一个解决方案,它使用正则表达式提取 ( ) 和 literal_eval 之间的所有值 + 一个自定义类来将数据解析为具有所需属性的对象:

from ast import literal_eval
import re


class Fault:

    def __init__(self, stats):
        element, *reason, time = literal_eval(stats)
        self.element = element
        self.reason = reason[0] if reason else ''
        self.time = time

    def __repr__(self):
        return f'{self.__class__.__name__}("({self.element!r}, {self.reason!r}, {self.time!r})")'



data = "[('G 05', 'Over-Speed', '1.63'), ('Load 23A_UF', '11.37'), ('Load 21A_UF', '11.38'), ('Load 08A_UF', '11.38'), ('Load 07A_UF', '11.38'), ('Load 12A_UF', '11.38'), ('Load 24A_UF', '11.38'), ('Load 15A_UF', '11.38'), ('Load 16A_UF', '11.38'), ('Load 04A_UF', '11.38'), ('Load 03A_UF', '11.38'), ('Load 18A_UF', '11.38'), ('Load 25A_UF', '11.38'), ('Load 27A_UF', '11.39'), ('Load 26A_UF', '11.39')]"

matched = re.findall(r"\(.+?\)", data)
print([Fault(m) for m in matched])

f = Fault("('G 05', 'Over-Speed', '1.63')")
print(f.element)
print(f.reason)
print(f.time)

输出:

[Fault("('G 05', 'Over-Speed', '1.63')"), Fault("('Load 23A_UF', '', '11.37')")...]

G 05
Over-Speed
1.63

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多