Python 如何根据新词典中列表的值所施加的条件对词典的值进行排序?

Python 如何根据新词典中列表的值所施加的条件对词典的值进行排序?,python,list,dictionary,isalpha,Python,List,Dictionary,Isalpha,为标题道歉,我想不出一个表达方式,如果有人有我很乐意编辑的建议 基本上,我有一本字典和一份清单。字典: dict1 = {('red fruit', 'green fruit'): 'apple', ('orange fruit', 'pink fruit'): 'peach', ('five fruit', 'one fruit'): 51, ('ten fruit', 'nine fruit'): 19, ('period', 'exclamation mark'): '.!'} 名单如下

为标题道歉,我想不出一个表达方式,如果有人有我很乐意编辑的建议

基本上,我有一本字典和一份清单。字典:

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的键,新键是列表中的项

当值按字母顺序排列时(“字母表”)的值应为dict1的键,当值为数字时(“数字”)的值应为dict1的键,当两种情况下键的值均失败时(“两者都不”)的值应为dict1的键

例如,我的输出应该是:

{('alphabet'): [('red fruit', 'green fruit'), ('orange fruit', 'pink fruit')], ('number'): [('five fruit', 'one fruit'), ('ten fruit', 'nine fruit')], ('neither'): [('period', 'exclamation mark')]}
首先,我创建了一个新字典,其中包含列表中的键和空列表中的值,我希望在满足上述要求时(可能通过使用.isdigit()和.isalpha()将值添加到空列表中)。但我真的不明白当特定键通过需求时如何将值添加到它们


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

您可以循环字典中的键、值对,将键附加到适当的列表中,并使用它们形成新的字典

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'
相同(尽管上面我保留了您在分配
列表1
时使用的语法)

这里我使用了
isinstance(…,int)
,因为您的数据项是整数
isdigit
仅当它们是包含数字的字符串时才相关


还要注意的是,如果字符串中的所有字符都是字母顺序的,
isalpha
将只计算
True
。该方法主要用于单个字符,但问题并没有指定如果字符串包含多种字符类型的混合,应该如何处理,因此我将其保留在这里。但是如果你在一个字典值中间有一个空格,那么<代码> ISALPHA/<代码>将返回<代码> false <代码>,即使剩余字符是按字母顺序排列的。

如果我理解正确,您希望根据字典键的值的类型筛选出字典键,然后按照单独列表中所述的类型对键进行排序

要确定字符串的类型,您需要更准确地知道什么是“字母表”,而不仅仅是列出要定义的内容的名称。例如:

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')]}