【问题标题】:Check variables against a dictionary, and print the dictionary contents remaining对照字典检查变量,并打印剩余的字典内容
【发布时间】:2016-06-07 12:39:20
【问题描述】:

我想根据字典检查用户输入,然后打印字典中仍然存在但用户未输入的值。

这是我的代码,它接受用户输入,根据字典检查它并将其发送到下面的打印函数。

    elif choice == '7':
    print("Enter at least 4 pitches")
    set1 = str(input("Enter first pitch: "))
    set2 = str(input("Enter second pitch: "))
    set3 = str(input("Enter third pitch: "))
    set4 = str(input("Enter fourth pitch: "))
    set5 = str(input("Enter fifth pitch or type 'Done': "))
    if set5 == 'Done':
        setset1 = f(set1)
        setset2 = f(set2)
        setset3 = f(set3)
        setset4 = f(set4)

        setc4(setset1, setset2, setset3, setset4)

这是我的函数,它打印在字典中找到的内容,然后打印剩下的内容。

def setc4(vset1, vset2, vset3, vset4):
print(" ")
print("The complement of the four note set")
print(vset1, vset2, vset3, vset4)
print("is")

基本上我需要该函数来检查用户输入(即 A 和 B),然后打印字典中不是 A 和 B 的所有其他内容(即 C、D 和 E)。本质上,我正在运行“集合”和“补码”分析,用户输入集合,然后打印该集合的补码。

解决这个问题的最佳方法是什么?谢谢!

这是我的“笔记”字典。

notes = {
'Bs': 0,
'C': 0,
'Cs': 1,
'Db': 1,
'D': 2,
'Ds': 3,
'Eb': 3,
'E': 4,
'Fb': 4,
'Es': 5,
'F': 5,
'Fs': 6,
'Gb': 6,
'G': 7,
'Gs': 8,
'Ab': 8,
'A': 9,
'As': 10,
'Bb': 11,
'B': 11,
}

【问题讨论】:

    标签: python dictionary set theory


    【解决方案1】:

    使用difference 函数计算集差。

    number_of_inputs = ...
    inputs = []
    dictionary = {...}
    
    def print_diff():
        for i in range(number_of_inputs + 1):
            inputs.append(str(input("enter pitch {}".format(i + 1))))
        if inputs[-1] == 'Done':
            del inputs[-1]
            diff = dictionary.difference(set(inputs))
            print('The complement is ')
            for element in diff:
                print(element)
    

    例如:

    >>> number_of_inputs = 4
    >>> dictionary = {'one', 'two', 'three', 'four', 'five', 'six', 'seven'}
    >>> print_diff()
    
    enter pitch 1
    three
    enter pitch 2
    five
    enter pitch 3
    one
    enter pitch 4
    five
    enter pitch 5
    Done
    The complement is
    two
    four
    six
    seven
    

    请注意,底层字典数据结构不是dict,而是set。这是因为您实际上并不需要键值对的键。由于您实际拥有的字典是 dict,因此您可以删除键并将其转换为集合,如下所示:

    dictionary = set(dictionary.values())
    

    根据您对问题所做的编辑,您的字典中的值类型与您从用户那里获得的值类型不匹配。具体来说,你得到strs,但你有一个ints 的字典。您可以将您的字典转换为一组strs 或从用户那里检索ints。

    将字典从一组ints 转换为一组strs 可以如下完成:

    dictionary = {str(i) for i in dictionary}
    

    (你应该在dictionary = set(dictionary.values())之后执行以上行)

    从用户那里检索ints 而不是strs 可以按如下方式完成:

    int(input("enter pitch {}".format(i + 1)))
    

    而不是

    str(input("enter pitch {}".format(i + 1)))
    

    【讨论】:

    • 我已经实现了这个,但是我有一个'dict object has no attribute difference'错误。你有什么建议?我的字典叫做“notes”,所以我写了 notes.difference(set(inputs))。
    • AlexC:我理解你的问题,你的字典实际上是一组单词,对吧?它不是一组键值对。在这种情况下,您应该使用set(而不是dict)作为底层数据结构。也就是说,像我在上面的示例中所做的那样初始化您的字典。
    • AlexC:您可以将字典转换为集合(因为您只需要值,您可以删除键)。查看我对答案所做的修改。
    • 很好,该功能正在运行,并且字典已转换为具有新名称的集合(note_set)。然而,补码被列为不正确的所有数字 0-11。我已经在我的原始帖子中发布了我的笔记字典,以向您展示。感谢您迄今为止的所有帮助!
    • 我已经将我的字典转换为字符串列表,但是它现在像以前一样打印所有补数 (0-11),但顺序是随机的。即 0、10、5、4。这是因为我有多个变量分配给相同的数字,而且它只检查数字的第一个实例?即 Bs = 0 和 C = 0,但它只是检查 C,所以 0 仍然存在。感谢您到目前为止的帮助,我非常感谢。
    【解决方案2】:

    如果我理解正确,您可以简单地使用dict.pop()pop 返回指定键的值,然后将其从字典中删除。如果字典中不存在指定的键,则默认返回 None。

    a_dict = {'a': 1, 'b': 2, 'c': 3}
    
    print(a_dict.pop('a'))
    >> 1
    print(a_dict)
    >> {'c': 3, 'b': 2}
    

    【讨论】:

    • 太棒了!但是我有一些变量等于相同的数字,例如 Bs : 0 和 C : 0。字典仍在打印第二个。无论如何要删除所有匹配的变量,而不仅仅是第一个?另外,如何打印仅包含变量而不是所有 { } 括号的字典?谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2016-10-10
    相关资源
    最近更新 更多