成为Python的新手,我有点想弄清楚这两行是做什么的:
for i in [j for j in xrange(0, N) if [k for k in xrange(j) if now[k] == now[j]] == []]:
for j in [k for k in xrange(1, K + 1) if [l for l in xrange(i) if now[l] == k] == []]:
有没有办法重写这个,所以像我这样的新手可以理解它?感谢。
答案 0 :(得分:4)
唉。阅读那是身体上的痛苦。这是不如何使用列表推导的一个很好的例子。
这是一个严格的重写,不使用列表推导:
for i in xrange(0, N):
implicit_list_1 = []
for k in xrange(i):
if now[k] == now[i]:
implicit_list_1.append(i)
if implicit_list_1 == []:
for j in xrange(1, K + 1):
implicit_list_2 = []
for l in xrange(i):
if now[l] == j:
implicit_list_2.append(l)
if implicit_list_2 == []:
这是一个更惯用的重写:
for i in xrange(N):
if now[i] not in now[:i]:
for j in xrange(1, K + 1):
if j not in now[:i]:
这假设K
是一个单独的变量,而不是错误的k
。
另外,那些单字母变量名称的风格很差。最好使用实际反映变量使用的变量名称。
答案 1 :(得分:3)
我几乎肯定这段代码相当于:
for i in range(0, N):
prefix = set(now[:i])
if now[i] in prefix: continue
for j in range(1, K + 1):
if j in prefix: continue
# do something
或(效率稍低,但很好地反映了代码背后的想法):
for i, j in itertools.product(range(0, N), range(1, K + 1)):
prefix = now[:i]
if now[i] not in prefix and j not in prefix:
# do something with i and j
但是它是以一种令人沮丧,低效的方式写的(尤其是[...] == []
是令人讨厌且毫无意义的)。也许是那些使用复杂结构感觉非常聪明的人,其中简单的结构会更适合。
答案 2 :(得分:0)
我怀疑你是嵌套的list comprehensions令人困惑。
首先,您可以将它们拉出变量
firstlist = [j for j in xrange(0, N) if [k for k in xrange(j) if now[k] == now[j]] == []]
for i in firstlist:
secondlist = [k for k in xrange(1, K + 1) if [l for l in xrange(i) if now[l] == k] == []]
for j in secondlist:
您可以通过更改嵌套列表推导来完全使用普通的for循环来构建列表,从而使其更具可读性。
您一定要查看该文档链接以尝试掌握列表推导。它们是强大的构造,在我看来对那些理解它们的人来说更具可读性。但是嵌套列表推导可能很难理清。
答案 3 :(得分:0)
你可能会对列表理解感到困惑。即使对我来说写列表理解也很困难。但是不难解释什么是已经写好的列表理解脚本的意思。既然你说你想要noob友好的代码,下面的代码可能就像新用户友好一样。 (代码的执行可能略有不同,代码仅出于理解目的而提供)
#first list comprehension expanded ...
first_list = []
for j in xrange(0, N):
inner_first_list = []
for k in xrange(j):
if now[k] == now[j]:
inner_first_list.append(k)
if inner_first_list == []:
first_list.append(j)
#second list comprehension expanded ...
second_list = []
for k in xrange(1, K + 1):
inner_second_list = []
for l in xrange(i):
if now[l] == k:
inner_second_list.append(l)
if inner_second_list == []:
second_list.append(k)
#the actual loop ...
for i in first_list:
for j in second_list:
#your loop statement
您可以在此处更好地理解列表理解:Why are Python lambdas useful?