【问题标题】:Looping inside a text在文本内循环
【发布时间】:2018-04-02 20:20:40
【问题描述】:

我有以下文字:

我想实现以下目标。

用关键字 word1, ...(左边的那些)创建一个字典 然后我想将 word1 与 word7 相关联,在这种情况下,与 word 11 相关联(并添加重复)所以

word1 = [word7, word11, word11]

我想对左边的每个单词执行此操作,前提是它与之前已经计算的不同。

我尝试了以下方法,但它不起作用:

from collections import defaultdict


inputfile = open("file.txt","r")
keys  = []
key = ''

my_dict = defaultdict(list)

for line in inputfile:
    l=line.split()
    a= l[4].split("-")
    b_temp = l[7].rstrip("\'")
    b = b_temp.split("-")
    for elem in range(len(a)):
        if a not in keys:
            keys.append(a)
            key = a[elem]
            my_dict[key].append(b[elem])
            continue
        for var in range(len(a)):
            if a[var] == a[elem]:
                my_dict[key].append(b[var])

我知道左边的字数等于右边的字数。

例如,我得到类似 defaultdict(, {'aaaa': ["'word7", 'word10']})

但我愿意

在这种情况下

word1 = [word7, word11, word11]

word2 = [word8, word7]

word3 = [word9]

word4= [word10]

【问题讨论】:

  • 你能提供更多关于什么不起作用的上下文吗?您解决了哪些问题,或者遇到了哪些错误?
  • 我已经尝试过了,但它没有给出想要的结果。我认为问题出在 for 循环上。从某种意义上说,我必须循环到数据文件的所有行。但我没有这样做
  • 你得到了什么结果? '它不起作用',没有给我任何关于你的问题的信息。如果我现在在我的计算机上运行您的确切代码并且它可以工作,那会给我们留下什么?如果你说它导致某个字符串,'resulting string'。可能很容易看出您有转义字符问题或其他问题。
  • 索引不正确:用 4 代替 6,用 7 代替 8
  • 谢谢。我已经纠正了。但它仍然会产生不希望的结果。输出为 defaultdict(, {'aaaa': ["'word7", 'word10']})

标签: python dictionary


【解决方案1】:

我明白了。我相信您的逻辑在内部 for 循环 (for elem in ...) 之前都很好。解决方案更简单:您不需要嵌套 for 循环,只需使用zip 函数将a(我称之为keys)中的每个元素与b(我称之为values):

from collections import defaultdict

inputfile = open("file.txt","r")
my_dict = defaultdict(list)

for line in inputfile:
    line = line.split()
    keys = line[4].split("-")
    values = [v.strip("'") for v in line[7].split("-")]

    for k, v in zip(keys, values):
        my_dict[k].append(v)

for k, v in sorted(my_dict.items()):
    print('{} = {}'.format(k, v))

输出:

word1 = ['word7', 'word11', 'word11']  
word2 = ['word8', 'word7']             
word3 = ['word9']                      
word4 = ['word10']                     

【讨论】:

  • 非常感谢。但是,左边的单词之一也可能包含'。为了删除它,我添加了 values_temp = line[7].replace("'","") 和 "-" 上的拆分
  • 我的错。我错过了。由于撇号可以在任何地方,我修改了我的代码以从每个值中删除它。我还修改了输出,使其看起来更清晰。
【解决方案2】:

如果字符串 word 的数量在左侧和右侧相同,那么我认为您可以将 re 模块与 defaultdictzip 一起使用,如下例所示:

import re 
from collections import defaultdict

final = defaultdict(list)

with open('file.txt', 'r') as f:
    for k in f:
        words = re.findall(r'(word\d+)[- ]', k.strip('\n'))
        groupped_words = zip(words[:int(len(words)/2)], words[int(len(words)/2):])
        for key, value in groupped_words:
            final[key] += [value]

for k, v in sorted(final.items()):
    print('{} : {}'.format(k, v))

输出:

word1 : ['word7', 'word11', 'word11']
word2 : ['word8', 'word7']
word3 : ['word9']
word4 : ['word10']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 2022-05-17
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多