-1

为标题道歉,无法找到一种表达方式,如果有人有建议,我很乐意编辑!

基本上,我有一本字典和一个列表。词典:

dict1 = {('red fruit', 'green fruit'): 'apple', ('orange fruit', 'pink fruit'): 'peach', ('five fruit', 'one fruit'): 51, ('ten fruit', 'nine fruit'): 19, ('period', 'exclamation mark'): '.!'}

名单:

list1 = [('alphabet'), ('number'), ('neither')]

我要做的是根据列表中的项目对字典键的值进行排序并返回一个新字典,其中的值现在是 dict1 的键,新键是列表中的项目。

('alphabet') 的值应该是 dict1 的键,当它们的值是字母时,('number') 的值应该是 dict1 的键,当它们的值是数字时,并且 ('neither') 的值应该当键的值在两种情况下都失败时。

例如,我的输出应该是:

{('alphabet'): [('red fruit', 'green fruit'), ('orange fruit', 'pink fruit')], ('number'): [('five fruit', 'one fruit'), ('ten fruit', 'nine fruit')], ('neither'): [('period', 'exclamation mark')]}

我首先使用列表中的键和作为空列表的值创建一个新字典,并且我想在它们符合上述要求时添加值(可能通过使用 .isdigit() 和 .isalpha())到空列表。但是我真的不明白当它们通过要求时如何将值添加到特定键?

我是一个初学者,所以没有导入模块或列表理解的简单短代码将是理想的,但任何指导将不胜感激!谢谢!

4

2 回答 2

0

如果我理解正确,您想根据值的类型过滤掉字典键,然后按单独列表中所述的类型对键进行排序。

要确定字符串的类型,您需要更准确地了解什么是“字母”,而不是仅仅列出您要定义的事物的名称。例如:

def string_type(s):
    if s.isalpha():
        return 'alphabet'
    elif s.isdigit():
        return 'number'
    else:
        return 'neither'

然后,您可以继续过滤掉您想要的键,并按照您在中指定的顺序将它们放入字典中list1

def process(dict1, list1):
    output = {k: [] for k in list1}
    for key, val in dict1.items():
        t = string_type( str(val) )
        if t in list1:
            output[t].append(key)
    return output

示例输出:

>>> dict1 = {('red fruit', 'green fruit'): 'apple', ('orange fruit', 'pink fruit'): 'peach', ('five fruit', 'one fruit'): 51, ('ten fruit', 'nine fruit'): 19, ('period', 'exclamation mark'): '.!'}

>>> list1 = [('alphabet'), ('number'), ('neither')]
>>> process(dict1, list1)
{'alphabet': [('red fruit', 'green fruit'), ('orange fruit', 'pink fruit')], 'number': [('five fruit', 'one fruit'), ('ten fruit', 'nine fruit')], 'neither': [('period', 'exclamation mark')]}

>>> list2 = [('number'), ('neither'), ('alphabet')]
>>> process(dict1, list2)
{'number': [('five fruit', 'one fruit'), ('ten fruit', 'nine fruit')], 'neither': [('period', 'exclamation mark')], 'alphabet': [('red fruit', 'green fruit'), ('orange fruit', 'pink fruit')]}
于 2020-08-03T07:10:48.107 回答
0

您可以遍历字典中的键、值对,将键附加到适当的列表中,并使用它们来形成一个新字典。

dict1 = {('red fruit', 'green fruit'): 'apple',
         ('orange fruit', 'pink fruit'): 'peach',
         ('five fruit', 'one fruit'): 51,
         ('ten fruit', 'nine fruit'): 19,
         ('period', 'exclamation mark'): '.!'}

list1 = [('alphabet'), ('number'), ('neither')]

alphabetical = []
numerical = []
other = []

for key, value in dict1.items():

    if isinstance(value, int):
        numerical.append(key)

    elif value.isalpha():
        alphabetical.append(key)

    else:
        other.append(key)

list2 = {'alphabet': alphabetical,
         'number': numerical,
         'neither': other}

print(list2)

请注意,您使用('foo')的位置与此相同'foo'(尽管上面我保留了您在分配时使用的语法list1)。

我在这里使用过isinstance(..., int),因为您的数据项是整数。 isdigit只有当它们是包含数字的字符串时才相关。

另请注意,isalpha仅评估字符串中的所有字符是否按字母顺序排列True。该方法主要用于单个字符,但问题没有指定如果字符串包含混合类型的字符会发生什么,所以我把它放在这里。但是,例如,如果您的一个字典值中间有一个空格,那么即使其余字符是字母顺序,也会返回。isalphaFalse

于 2020-08-03T06:53:44.223 回答