我在一個串列上回圈了兩次,想要捕獲所有唯一的對,而不是所有的組合——即。對中的順序無關緊要
listy=[0,1,2]
out=[]
for i in listy:
for j in listy:
out.append([i,j])
我得到的輸出是 [[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0], [2,1],[2,2]]
我正在尋找的是 [[0,0],[0,1],[0,2],[1,1],[1,2],[2,2]]
一種可能的解決方案是,
listy=[0,1,2]
out=[]
for i in listy:
for j in listy:
pair=set([i,j])
if pair not in out:
out.append(pair)
這會產生 [{0},{0,1},{0,2},{1},{1,2},{2}]
但是,這會在繁重的腳本中造成效率低下(串列很長),而且我也不想要集合串列。我想要一個串列串列。
有沒有更好的方法可以在不使用 itertools 的情況下實作這一點(我想要一個實作,我也可以應用到 javascript 而無需太多重新思考)
uj5u.com熱心網友回復:
我根本不懂javascript,但如果有類似于串列理解的東西,我會試試這個:
listy = [0,1,2]
pairs = [[i, j] for i in listy for j in listy if i <= j]
對的內容完全符合您的要求:
[[0, 0], [0, 1], [0, 2], [1, 1], [1, 2], [2, 2]]
uj5u.com熱心網友回復:
選項 1 - “小修復”
一個微不足道的“修復”將是:
listy=[0,1,2]
out=set()
for i in listy:
for j in listy:
if (i, j) not in out and (j, i) not in out:
out.add((i,j))
結果是:
{(0, 1), (1, 2), (0, 0), (1, 1), (0, 2), (2, 2)}
然而,這不是一個有效的實作,因為我們必須檢查兩次元素是否在串列中。
選項 2 - 更有效的實施
您可以使用陣列的簡單掃描來實作您的目標:
listy=[0,1,2]
out = [(i, j) for i in range(len(listy)) for j in range(i, len(listy))]
注意:我對對使用元組,您可以使用以下方法輕松地將其更改為串列串列:
out = [[i, j] for i in range(len(listy)) for j in range(i, len(listy))]
uj5u.com熱心網友回復:
itertools.combinations_with_replacement(listy, 2)直接從輸入生成您想要的結果的最直接的翻譯(與您想要的行為相匹配)list是:
listy = [0,1,2]
out = []
for idx, i in enumerate(listy):
for j in listy[idx:]:
out.append([i, j])
唯一的變化是使用enumerate(在迭代時迭代當前索引)并listy在內部回圈中對使用的索引進行切片(因此它從與當前運行的外部回圈相同的索引開始)。
這以最小的開銷獲得了所請求的確切結果(它確實list為每個內部回圈制作了減小大小的 , 的淺表副本,但這在 Python 中相當快;除非list它很大,否則它應該是一個非常小的成本)。如果您需要避免切片,您可以使內部回圈成為帶有索引的基于索引的回圈(但在實踐中,索引的開銷足夠高,以至于它經常會輸給切片):
listy = [0,1,2]
out = []
for idx, i in enumerate(listy):
for idxj in range(idx, len(listy)):
out.append([i, j[idxj]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/485533.html
標籤:Python python-3.x
