列表理解不正常

时间:2018-03-12 07:54:19

标签: python python-3.x list-comprehension

 def first_and_last(list_1):
    new_list = [i for i in list_1 if i ==(list_1[0] or list_1[len(list_1 - 1)])]
    return new_list

输入数字序列后,输出与原始列表保持一致。我认为我的列表理解会出现问题

a= [input("Enter a sequence of numbers separated by commas :")]

b = first_and_last(a)
print (b)

3 个答案:

答案 0 :(得分:0)

我的python控制台的以下输出可能已经阐明了一些事项:

>>> new_list = [input()]
1, 2, 3, 4
>>> new_list
[(1, 2, 3, 4)]
>>> l = [i for i in new_list if i==(new_list[0] or new_list[-1])]
>>> l
[(1, 2, 3, 4)]
>>> new_list[-1]
(1, 2, 3, 4)

您有一个列表,但您的列表a只有一个元素。在我的示例中,a仅包含元素(1, 2, 3, 4)。 当你进行列表推导时,你会得到元素,如果它等于第一个或最后一个元素 - 它就是这样做的。并且没有错误,因为索引-1只代表列表中的最后一个元素。

您可以将输入元组转换为列表:

>>> list(input())
1, 2, 3, 4
[1, 2, 3, 4]

然后,您的列表理解可以起作用 我不确定你的if语法是否有效。我会选择

>>> li = list(input())
1, 2, -3, 4
>>> new_list = [i for i in li if (li[0]==i or i==li[-1])]
>>> new_list
[1, 4]
>>> lix = list(input())
1, 1, 2, 3, 4, 2
>>> other_list = [i for i in lix if (lix[0]==i or i==lix[-1])]
>>> other_list
[1, 1, 2, 2]

如果您使用if语法,那么您要测试的是元素是否等于(li[0] or li[-1])。我相信这总是0或1,因为它是一个布尔表达式。

>>> other_list = [i for i in lix if i==(lix[0] or lix[-1])]
>>> other_list
[1, 1]

我在python 2.7.14中对此进行了测试,因此您的语法可能略有不同。

答案 1 :(得分:0)

  1. 您需要将字符串拆分为列表。
  2. 您可以简化您的情况。
  3. 代码:

    def first_and_last(input):
      list = input.split(',')
      match = list[0], list[-1]
      return [i for i in list if i in match]
    

答案 2 :(得分:0)

我发现了两个问题:

1)

a = [input("Enter a sequence of numbers separated by commas :")]

这将为您提供一个列表,其中包含整个字符串作为单个元素,但不包含单个元素。例如,在执行此字符串时,您将获得...

a = ['1,2,3,4,5']

要解决此问题,您需要获取字符串输入并将其拆分为","

a = input("Enter a sequence of numbers separated by commas :").split(",")

2)

列表推导中使用的条件过滤器是错误的。

2 or 3 = 2
3 or 2 = 3
0 or 2 = 2
2 or 0 = 2

如果有" 0" element返回另一个非零元素,如果两者都不为零则返回第一个元素,因此

如果我的名单是......

a = [1 , 2 , 3]
b = first_and_last(a)
print(b)

这将导致

b = [3]

因此,正确的条件或方法将是

new_list = [i for i in list_1 if i == list_1[0] or i == list_1[len(list_1 - 1)]]

b = list()
b.append(a[0])
b.append(a[len(a)-1])