首页 > 解决方案 > 嵌套在字典理解中的列表理解

问题描述

我想创建一个以列表为值的字典,其中列表上的内容取决于键(数字 1 到 100)是否可被 3,5 和/或 7 整除

输出将是这样的:

{
    1: ['nodiv3', 'nodiv5', 'nodiv7'],
    3: ['div3', 'nodiv5', 'nodiv7'],
    15: ['div3', 'div5', 'nodiv7'],
}

关于过滤列表/值而不是创建它们的类似问题。

dict_divider = {}
for x in range(0,101):
    div_list= []
    if x % 3 == 0:
        div_list.append('div3')
    else:
        div_list.append('nodiv3')
    if x % 5 == 0:
        div_list.append('div5')
    else:
        div_list.append('nodiv5')
    if x % 7 == 0:
        div_list.append('div7')
    else:
        div_list.append('nodiv7')
    dict_divider[x] = div_list

这工作得很好,但是有没有办法用 pythonic one-/twoliner 做到这一点?

像这样的东西:d = dict((val, range(int(val), int(val) + 2)) for val in ['1', '2', '3'])

标签: pythonlist-comprehensiondictionary-comprehension

解决方案


Pythonic 不是关于一两个班轮。在我看来(主要)是关于可读性,也许这可以被认为是更pythonic

def label(n, divisor):
    return f"{'' if n % divisor == 0 else 'no'}div{divisor}"


def find_divisors(n, divisors=[3, 5, 7]):
    return [label(n, divisor) for divisor in divisors]


dict_divider = {x: find_divisors(x) for x in range(1, 101)}

print(dict_divider) 

推荐阅读