【问题标题】:Store specific lines from a multiline file as values in a dictionary (Python)将多行文件中的特定行存储为字典中的值(Python)
【发布时间】:2020-08-17 16:30:29
【问题描述】:

我有一个多行脚本文件,其中包含文本行和相应的时间戳。它看起来像这样:

00:02:01,640  00:02:04,409
word word CHERRY word word

00:02:04,409  00:02:07,229
word APPLE word word

00:02:07,229  00:02:09,380
word word word word

00:02:09,380  00:02:12,060
word BANANA word word word 

现在,如果文本包含我已经存储在列表中的特定单词(水果类型),这些单词将作为键存储在字典中。我的代码:

Dict = {}
FruitList = []

for w in transcript.split():
    if w in my_list:
        FruitList.append(w)
      
keys = FruitList

打印keys的输出为:['CHERRY', 'APPLE', 'BANANA']

继续前进,我的问题是我想提取属于包含水果的行的时间戳,并将它们作为值存储在字典中 - 但只有那些对应于下面的行的时间戳,其中给出了一种水果. 对于这个任务,我有几个代码 sn-ps:

values = [] # shall contain timestamps later

timestamp_pattern = re.compile(r"\d{2}:\d{2}:\d{2},\d{3}  \d{2}:\d{2}:\d{2},\d{3}")


for i in keys:
    Dict[i] = values[i]

不幸的是,我不知道如何编写代码以仅获取相关的时间戳并将它们作为值与它们的键(水果)一起存储在字典中。

所需的输出 (Dict) 应如下所示:

{'CHERRY': '00:02:01,640 -> 00:02:04,409', 

'APPLE': '00:02:04,409 -> 00:02:07,229', 

'BANANA': '00:02:09,380 -> 00:02:12,060'}

谁能帮忙?

非常感谢!

【问题讨论】:

  • 你有时间检查我的方法吗?对你起作用吗?如果不是,那是什么问题?
  • @WiktorStribizew:对于迟到的答案,我很抱歉,但中间出现了一些问题,所以昨天晚上我没有足够的时间来测试它。我现在就试试你的方法,让你知道它是否适合我:-)
  • @WiktorStribiżew:是的,它有效!谢谢!然而,不幸的是,这种方法对于我的任务来说并不是 100% 理想的,因为水果的类型需要在正则表达式模式中手动输入。但至于我的成绩单,我不确定文本中会出现哪些果实,或者是否会有任何果实。如果有,它们应该完全像在您的方法的输出中那样处理。 :-)
  • 没问题,动态构建模式就好,下面看我的回答。

标签: python python-3.x regex dictionary


【解决方案1】:

这看起来像你可以使用zip 并避免使用正则表达式,考虑到线条的模式:

d = {}
lines = transcript.split('\n')
for x, y in zip(lines, lines[1:]):
    for w in my_list:
        if w in y.split():
            splits = x.split()
            d[w] = f'{splits[0]} -> {splits[1]}'
            
print(d)

【讨论】:

  • 嗯,不幸的是,我用这种方法得到了一个空字典,我正试图找出原因。
  • @mareikesthesis,我假设transcript 是行列表。你检查的方式一样吗?
  • transcript 是一个字符串,my_list 是一个列表。抱歉,我想我应该早点提到这一点。
  • 不用担心。相应更新。
【解决方案2】:

你可以使用

^(\d{2}:\d{2}:\d{2},\d{3}  \d{2}:\d{2}:\d{2},\d{3})\n.*\b(CHERRY|APPLE|BANANA)\b

请参阅regex demo。使用此模式,您可以将时间跨度线和关键字捕获到可以使用re.findall 检索的单独组中。交换两个捕获的值后,您可以将元组列表转换为字典。

如果你从一个文件中读取数据,你需要使用with open(fpath, 'r') as r:然后contents = r.read()将整个内容读入一个字符串变量中。

Python demo:

import re
text = "00:02:01,640  00:02:04,409\nword word CHERRY word word\n\n00:02:04,409  00:02:07,229\nword APPLE word word\n\n00:02:07,229  00:02:09,380\nword word word word\n\n00:02:09,380  00:02:12,060\nword BANANA word word word"
t = r"\d{2}:\d{2}:\d{2},\d{3}"
keys = ['CHERRY', 'APPLE', 'BANANA']
rx = re.compile(fr"^({t}  {t})\n.*\b({'|'.join(keys)})\b", re.M)
print( dict([(y,x) for x, y in rx.findall(text)]) )

输出:

{'CHERRY': '00:02:01,640  00:02:04,409', 'APPLE': '00:02:04,409  00:02:07,229', 'BANANA': '00:02:09,380  00:02:12,060'}

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2019-11-04
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多