2017-02-03 108 views
-2

我有一項任務,使用列表理解將值添加到排序列表。我不允許導入模塊,只能列出理解,最好是一個班輪。我不允許創建函數並使用它們。 我完全在這個問題的黑暗中。希望有人可以幫助:)通過列表理解將值插入排序列表Python

編輯:我不需要改變當前列表。事實上,我現在正在試用我的解決方案.pop,我需要創建一個新的列表,添加正確的元素,但我仍然無法弄清楚。

+0

這似乎是非常糟糕深思熟慮的分配。列表推導是功能性結構,不應該用於改變現有列表。他們創建*新列表* –

+0

轉讓可能會在正確的位置添加新增值。我懷疑他們是否意味着改變原始列表。我懷疑我需要在列表理解中使用一個或多個'if'子句。 – hpaulj

+0

@ juanpa.arrivillaga是的,這就是他們的意思,對不起,如果我寫得很差。但我仍然無法弄清楚。我嘗試了一些彈出式元素,如果它們小於值或者它們更大,並且值出現的次數大於1,但它效果不佳 –

回答

3
try: 
    sorted_a.insert(next(i for i,lhs,rhs in enumerate(zip(sorted_a,sorted_a[1:])) if lhs <= value <= rhs),value) 
except StopIteration: 
    sorted_a.append(value) 

我想....

與你的新問題陳述

[x for x in sorted_a if x <= value] + [value,] + [y for y in sorted_a if y >= value] 

你當然可以提高大O的複雜性

+1

A +爲你先生Joran;) – miradulo

+0

除了刪除列表理解因爲它不是必要的,你不再符合OP的規範! – miradulo

+1

其中一個發電機的理解我確信他的老師會給他額外的功勞,如果他可以解釋它; P –

1

對於平分的列表,你可以使用bisect.bisect(供其他讀者參考將來的答案) as:

>>> from bisect import bisect 

>>> my_list = [2, 4, 6, 9, 10, 15, 18, 20] 
>>> num = 12 

>>> index = bisect(my_list, num) 
>>> my_list[:index]+[num] + my_list[index:] 
[2, 4, 6, 9, 10, 12, 15, 18, 20] 

但因爲你不能導入庫,你可以使用sumzip列表理解表達爲:

>>> my_list = [2, 4, 6, 9, 10, 15, 18, 20] 
>>> num = 12 

>>> sum([[i, num] if i<num<j else [i] for i, j in zip(my_list,my_list[1:])], []) 
[2, 4, 6, 9, 10, 12, 15, 18] 
+1

我會用'itertools.chain'來壓扁列表,但這是一個導入的模塊。使用'sum(alist,[])'扁平化對我來說是一個新的成語。 – hpaulj

+1

@hpaulj'itertools.chain'絕對是一種更好的鏈接方式。正如你猜對的那樣; 'sum'用於防止導入 –

+1

其比itertools.chain慢得多...但它符合問題定義(即使在編輯問題後...),這就是爲什麼我的+1:P –