Python 列表理解嵌套在Dict理解中
我想创建一个以列表为值的dict,其中列表上的内容取决于键(数字1到100)是否可以除以3、5和/或7 输出如下所示: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
{
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)}