2017-08-30 140 views
2

我想寫一個函數,它將此列表的第一個元素與此列表的最後一個元素進行比較,此列表的第二個元素與此列表的第二個最後一個元素,等等。如果比較的元素相同,我想將元素添加到新列表中。最後,我想打印這個新列表。比較第一個和最後一個元素,第二個和第二個最後一個元素等的函數

例如,

>>> f([1,5,7,7,8,1]) 
[1,7] 
>>> f([3,1,4,1,5] 
[1,4] 
>>> f([2,3,5,7,1,3,5]) 
[3,7] 

我想先取(i)和去年(k)的元素,對它們進行比較,然後擡起我,但較低的K,然後重複上述過程。當我和K'重疊時,停止並打印列表。我試圖想象我的想法在下面的代碼:

def f(x): 
    newlist=[] 
    k=len(x)-1 
    i=0 
    for j in x: 
     if x[i]==x[k]: 
      if i<k: 
       newlist.append(x[i]) 
     i=i+1 
     k=k-1 
    print(newlist) 

請讓我知道,如果有我的代碼中的任何錯誤,或是否有解決問題的一個更合適的方式。

由於我是Python新手,在理解Python的複雜術語/特性方面我不太擅長。因此,如果您在回答中考慮了這一點,將會受到鼓勵。

+0

遍歷序列產生的元素,而不是指標。 –

+0

@ IgnacioVazquez-Abrams我明白了!我編輯了我的代碼來解決這個問題。 – Jazzachi

+1

爲什麼你的第二個例子也返回[4],但第三個例子不返回[7]? (在這兩種情況下,它們都是「列表中心」的元素) – FLab

回答

0

也許你想要的東西,像甚至長名單:

>>> r=[l[i] for i in range(len(l)/2) if l[i]==l[-(i+1)]] 
>>> r 
[3] 
>>> l=[1,5,7,7,8,1] 
>>> r=[l[i] for i in range(len(l)/2) if l[i]==l[-(i+1)]] 
>>> r 
[1, 7] 

而對於名單的奇長度:

>>> l=[3,1,4,1,5] 
>>> r=[l[i] for i in range(len(l)/2+1) if l[i]==l[-(i+1)]] 
>>> r 
[1, 4] 

這樣你就可以創建一個功能:

def myfunc(mylist): 
    if (len(mylist) % 2 == 0): 
      return [l[i] for i in range(len(l)/2) if l[i]==l[-(i+1)]] 
    else: 
      return [l[i] for i in range(len(l)/2+1) if l[i]==l[-(i+1)]] 

並以這種方式使用它:

>>> l=[1,5,7,7,8,1] 
>>> myfunc(l) 
[1, 7] 
>>> l=[3,1,4,1,5] 
>>> myfunc(l) 
[1, 4] 
+1

我想像OP會希望解決所有問題的解決方案。 –

+0

肯定我已經完成我的帖子 – Dadep

2

你可以使用一個條件列表理解與enumerate,在指數-1-i索引i元素x比較的元素(-1是列表的最後一個索引):

>>> lst = [1,5,7,7,8,1] 
>>> [x for i, x in enumerate(lst[:(len(lst)+1)//2]) if lst[-1-i] == x] 
[1, 7] 
>>> lst = [3,1,4,1,5] 
>>> [x for i, x in enumerate(lst[:(len(lst)+1)//2]) if lst[-1-i] == x] 
[1, 4] 

或者,正如已經建議在其他答案中,請使用zip。但是,第一個參數就足夠了;第二個可以是reversed列表,因爲zip將在參數列表中的一個完成後停止,從而使代碼更短一些。

>>> [x for x, y in zip(lst[:(len(lst)+1)//2], reversed(lst)) if x == y] 

在兩種方法中,(len(lst)+1)//2相當於int(math.ceil(len(lst)/2))

+1

對於[[3,1,4,1,5]' –

+0

@ Ev.Kounis Yup失敗,對於奇數編號的列表一個接一個地失敗。固定。 –

0

您可以使用從zip_longest利用了以下情況:

from itertools import zip_longest 

def compare(lst): 
    size = len(lst) // 2 
    return [y for x, y in zip_longest(lst[:size], lst[-1:size-1:-1], fillvalue=None) if x == y or x is None] 

print(compare([1, 5, 7, 7, 8, 1]))  # [1, 7] 
print(compare([3, 1, 4, 1, 5]))   # [1, 4] 
print(compare([2, 3, 5, 7, 1, 3, 5])) # [3, 7] 

zip_longest

通常情況下,zip停止zip平當它的迭代器的一個用完。 zip_longest沒有這個限制,它只是通過添加虛擬值來保持zip ping。

例子:

list(zip([1, 2, 3], ['a']))       # [(1, 'a')] 
list(zip_longest([1, 2, 3], ['a'], fillvalue='z')) # [(1, 'a'), (2, 'z'), (3, 'z')] 
+0

你能解釋一下fillvalue和zip_longest是做什麼的嗎?我不熟悉itertools。 – Jazzachi

+0

@Jazzachi添加了文檔和示例的鏈接。這很容易理解。 –

+0

'size =(len(lst)+ 1)// 2'和'zip(lst [:size],lst [-1:size-2:-1])不需要'zip_longest'' –

0

你可以做的是壓縮比上半年和下半年逆轉,使用列表理解來構建相同的人的名單:

[element_1 for element_1, element_2 in zip(l[:len(l)//2], reversed(l[(len(l)+1)//2:])) if element_1 == element_2] 

會發生什麼是你取前半部分,並將其重複爲元素_1,後半部分與元素_2相反,然後只添加它們,如果它們相同:

l = [1, 2, 3, 3, 2, 4] 
l[:len(l)//2] == [1, 2, 3] 
reversed(l[(len(l)+1)//2:])) == [4, 2, 3] 
1 != 4, 2 == 2, 3 == 3, result == [2, 3] 

如果你也想在奇數名單的情況下,中量元素,我們就可以擴大我們的名單既包括中間元素,這將始終評估一樣:

[element_1 for element_1, element_2 in zip(l[:(len(l) + 1)//2], reversed(l[len(l)//2:])) if element_1 == element_2] 

l = [3, 1, 4, 1, 5] 
l[:len(l)//2] == [3, 1, 4] 
reversed(l[(len(l)+1)//2:])) == [5, 1, 4] 
3 != 5, 1 == 1, 4 == 4, result == [1, 4] 
+0

yes但是不太...看到我的答案。 –

+0

好點,我認爲一個不算。我會編輯它 –

0

這裏我的解決方案:

[el1 for (el1, el2) in zip(L[:len(L)//2+1], L[len(L)//2:][::-1]) if el1==el2] 

有很多事情,所以讓我一步一步講解:

  • L[:len(L)//2+1]是第一HAL列表F的加額外的元素(其是用於奇數長度的表是有用的)
  • L[len(L)//2:][::-1]是列表的第二半,反轉([::-1]
  • zip創建從兩個列表對的列表。它停在最短列表的末尾。我們在列表的長度是偶數的情況下使用這個,所以上半部分的額外項被忽略了
  • List comprehension基本上等於for循環,但對於創建一個「即時」列表非常有用。只有if條件爲真時它纔會返回一個元素,否則它會通過。

您可以輕鬆地修改,如果你有興趣在指標(上半年)以上的解決方案,其中匹配發生:

[idx for idx, (el1, el2) in enumerate(zip(L[:len(L)//2+1], L[len(L)//2:][::-1])) if el1==el2] 
相關問題