在文本中循环

时间:2018-04-02 20:20:40

标签: python dictionary

我有以下文字:

我想实现以下目标。

使用键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]

2 个答案:

答案 0 :(得分:0)

我明白了。我相信你的逻辑很好,直到内部for循环(for elem in ...)。解决方案更简单:您不需要嵌套for循环,只需使用zip函数将a中的每个元素(我称之为keys)与{中的相应元素配对{1}}(我称之为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))

答案 1 :(得分:0)

如果字符串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']