Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表理解嵌套在Dict理解中_Python_List Comprehension_Dictionary Comprehension - Fatal编程技术网

Python 列表理解嵌套在Dict理解中

Python 列表理解嵌套在Dict理解中,python,list-comprehension,dictionary-comprehension,Python,List Comprehension,Dictionary Comprehension,我想创建一个以列表为值的dict,其中列表上的内容取决于键(数字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_lis

我想创建一个以列表为值的dict,其中列表上的内容取决于键(数字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
这很好,但是有没有一种方法可以用蟒蛇式的单/双衬里来做到这一点


类似这样:
d=dict((val,range(int(val),int(val)+2))表示['1','2','3']中的val)

Pythonic并不是一行或两行。在我看来,(主要)是关于可读性,也许这可以被认为是更具python风格的:


Pythonic不是关于一两行的。在我看来,(主要)是关于可读性,也许这可以被认为是更具python风格的:


您可以编写第二个循环,这样您只需编写
if…else
一次

dict_divider={}
div_check_lst=[3,5,7]
对于范围(0101)内的x:
div_list=[]
对于div_check in div_check lst:
如果x%div\u check==0:
追加(f'div{str(div\u检查)})
其他:
div_list.append(f'nodiv{str(div_check)})
dict\u divider[x]=div\u列表

dict_divider={x:[f'{'no'*x%div_check!=0}div{str(div_check)}用于div_check中div_check的范围(0101)内的x

您可以编写第二个循环,这样您只需编写
if…else
一次

dict_divider={}
div_check_lst=[3,5,7]
对于范围(0101)内的x:
div_list=[]
对于div_check in div_check lst:
如果x%div\u check==0:
追加(f'div{str(div\u检查)})
其他:
div_list.append(f'nodiv{str(div_check)})
dict\u divider[x]=div\u列表

dict_divider={x:[f'{'no'*x%div_check!=0}div{str(div_check)}用于div_check中div_check的范围(0101)内的x

实际上,有一行代码甚至没有那么复杂:)


实际上,有一行代码甚至没有那么复杂:)


你实际上不需要做所有这些蛮力师。每三个数可被三整除,每七个数可被七整除,以此类推:

0 1 2 3 4 5 6 7 8 9 ...  <-- range(10)
0 1 2 0 1 2 0 1 2 0 ...  <-- mod 3

0 1 2 3 4 5 6 7 8 9 ...  <-- range(10)
0 1 2 3 4 5 6 0 1 2 ...  <-- mod 7

你实际上不需要做所有这些蛮力师。每三个数可被三整除,每七个数可被七整除,以此类推:

0 1 2 3 4 5 6 7 8 9 ...  <-- range(10)
0 1 2 0 1 2 0 1 2 0 ...  <-- mod 3

0 1 2 3 4 5 6 7 8 9 ...  <-- range(10)
0 1 2 3 4 5 6 0 1 2 ...  <-- mod 7

然而,如果它必须是不同的值,那么你会怎么做呢,不仅仅是div/nodiv,而是div3/nodiv3等等?我想你可以使用一些mor-else/if语句来实现这个目的,但在某个时候它会变得丑陋。。根据
timeit
,我的方法比这个答案的效率大约高400%。然而,如果它必须是不同的值,那么不仅是div/nodiv,而且是div3/nodiv3等等,你会怎么做呢?我想你可以使用一些mor-else/if语句来达到这个目的,但在某个时候它会变得丑陋。。根据
timeit
,我的方法比这个答案的效率大约高400%。
0 1 2 3 4 5 6 7 8 9 ...  <-- range(10)
0 1 2 0 1 2 0 1 2 0 ...  <-- mod 3

0 1 2 3 4 5 6 7 8 9 ...  <-- range(10)
0 1 2 3 4 5 6 0 1 2 ...  <-- mod 7
import itertools

def divs(n):
    L = [f"div{n}"] + [f"nodiv{n}"] * (n - 1)
    return itertools.cycle(L)

repeaters = [divs(n) for n in (3, 5, 7)]
d = {x: s for x, *s in zip(range(101), *repeaters)}