Python - 这两行做什么?

时间:2012-03-07 04:31:21

标签: python

成为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] == []]:

有没有办法重写这个,所以像我这样的新手可以理解它?感谢。

4 个答案:

答案 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?