迭代字典中的值以反转键和值

时间:2017-12-08 09:23:12

标签: python-3.x dictionary

我正在尝试使用下面的代码反转意大利语 - 英语词典。

有些术语有一个翻译,而有些术语有多种可能性。如果一个条目有多个翻译,我会遍历每个单词,将其添加到英语 - 意大利语单词(如果尚未存在)。

如果只有一个翻译它不应该迭代,但是当我编写代码时,它确实如此。此外,只有具有多个翻译的术语中的最后一个翻译被添加到字典中。我无法弄清楚如何重写代码来解决应该是一个非常简单的任务

def rk4(f, x0, y0, x1, n):
    vx = [0] * (n + 1)
    vy = [0] * (n + 1)
    h = (x1 - x0) / float(n)
    vx[0] = x = x0
    vy[0] = y = y0
    for i in range(1, n + 1):
        k1 = h * f(x, y)
        k2 = h * f(x + 0.5 * h, y + 0.5 * k1)
        k3 = h * f(x + 0.5 * h, y + 0.5 * k2)
        k4 = h * f(x + h, y + k3)
        vx[i] = x = x0 + i * h
        vy[i] = y = y + (k1 + k2 + k2 + k3 + k3 + k4) / 6
return vx, vy

运行此代码时,我得到:

from collections import defaultdict

def invertdict():
    source_dict ={'paramezzale (s.m.)': ['hog', 'keelson', 'inner keel'], 'vento (s.m.)': 'wind'}

    english_dict = defaultdict(list)

    for parola, words in source_dict.items():
        if len(words) > 1: # more than one translation ?
            for word in words: # if true, iterate through each word
                word = str(word).strip(' ')
                print(word)
        else: # only one translation, don't iterate!!
            word = str(words).strip(' ')
            print(word)
        if word in english_dict.keys(): # check to see if the term already exists
            if english_dict[word] != parola: # check that the italian is not present 
                #english_dict[word] = [english_dict[word], parola]
                english_dict[word].append(parola).strip('')
        else:
           english_dict[word] = parola.strip(' ')

    print(len(english_dict)) 

    for key,value in english_dict.items():
       print(key, value)

而不是

hog
keelson
inner keel
w
i
n
d
2
inner keel paramezzale (s.m.)
d vento (s.m.)

1 个答案:

答案 0 :(得分:1)

在字典中的任何地方使用列表会更容易,例如:

source_dict = {'many translations': ['a', 'b'], 'one translation': ['c']}

然后你需要2个嵌套循环。现在你并不总是在运行内循环。

for italian_word, english_words in source_dict.items():
    for english_word in english_words:
        # print, add to english dict, etc.

如果您无法更改source_dict格式,则需要明确检查类型。我会转换列表中的单个项目。

for italian_word, item in source_dict.items():
    if not isinstance(item, list):
        item = [item]

完整代码:

source_dict ={'paramezzale (s.m.)': ['hog', 'keelson', 'inner keel'], 'vento (s.m.)': ['wind']}

english_dict = defaultdict(list)

for parola, words in source_dict.items():
    for word in words:
        word = str(word).strip(' ')
        # add to the list if not already present
        # english_dict is a defaultdict(list) so we can use .append directly
        if parola not in english_dict[word]: 
               english_dict[word].append(parola)