[英]How do I keep the order of sorted numbers in a list the same in Python
我有一個函數,其中:
給定Python值xs和非負整數n的列表,構造並返回xs的副本,但每個值均復制n次。 不要修改原始列表“ xs”
為此,我創建了一些小代碼,將列表xs相乘,然后對其進行排序。
def replicate(xs,n): xscopy = sorted(n * xs) return xscopy
此代碼將導致像“ replicate([1,2,2,3],2)”這樣的函數輸入,輸出為正確的[1,1,2,2,2,2,3,3]。 注意正確的輸出如何使數字的位置匹配。
但是 ,當列表中有負數時,“排序”功能會看到負數小於正數,並將負數的位置從其最初在列表中的位置移開。
例如:復制([1,-1,2,1],2)輸出到[-1,-1,1,1,1,1,2,2],而不是正確的版本[1,1 ,-1,-1,2,2,1,1]。
注意負數1如何移位?
我需要為此任務使用某種循環(同時或針對此循環),我無法弄清楚如何合並一個既可以保留數字位置又可以將數字正確附加到新列表中的循環(一個包含原始xs和重復項的新列表,其順序與原始順序相同。
編輯:我應該添加列表理解此任務被限制
如果要保留原始列表中元素的順序,則可以使用嵌套列表推導,這將從列表xs中獲取每個元素,重復n次,然后查找下一個元素,依此類推:
xs = [1,-1,2,1]
n = 2
[x for x in xs for _ in range(n)]
# [1, 1, -1, -1, 2, 2, 1, 1]
xs = [1,2,3]
n = 2
[x for x in xs for _ in range(n)]
# [1, 1, 2, 2, 3, 3]
def replicate(xs, n):
return [item for item in xs for repeat in range(n)]
您無需對其進行排序。 對於列表中的每個數字,循環n
次並將其添加到新列表中,這樣您就可以保留原始列表並仍然獲得所需的內容。
def replicate(xs,n):
result = []
for num in xs:
for _ in range(n):
result.append(num)
return result
一種更簡潔的方法是使用列表推導return [num for num in xs for _ in range(n)]
無論哪種方式, replicate([1,-1,2,1],2)
都是[1, 1, -1, -1, 2, 2, 1, 1]
replicate([1,-1,2,1],2)
[1, 1, -1, -1, 2, 2, 1, 1]
您可以創建一個單元素列表,然后將其相乘。 一旦有了n元素列表,就可以用結果的該部分來extend()
結果列表。
result = []
for item in xs:
nitems = [item] * n
result.extend(nitems)
functools.reduce
函數可用於此目的:
import functools
return functools.reduce((lambda a,b: a + [b]*n), xs, [])
內置的sum
可以做類似的事情:
return sum( [ [x]*n for x in xs], [])
itertools.chain
函數可以將一堆可迭代對象粘貼在一起,因此您可以將值乘以一堆子列表,然后將它們傳遞給它:
import itertools
return list(itertools.chain(*[ [x]*n for x in xs ]))
或者,沒有splat( *
)運算符:
import itertools
return list(itertools.chain.from_iterable([[x]*n for x in xs])
或者,您可以將原始列表靠自身zip
,然后展平那些元組。 (這對於較長的列表會很有用,特別是如果您只返回迭代列表而不是列表的話):
import itertools
return list(itertools.chain.from_iterable(zip(*[iter(xs) for _ in range(n)])))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.