我正在尋找一種簡單的方法來找到所有可能的方法,在兩個串列list1和list2之間切換N元素,從而使新的串列list1'與list1的元素不同N。這兩個串列不會有共同的元素(更確切地說,它們包含一個索引集)。我需要的是所有可能的 list1' 的集合。
現在,我想要一個函式,它以list1, list2和N為引數,并回傳所有可能的串列,其中N元素被替換。每個串列中元素的順序并不重要。
例如,使用N=1, list1=[0,1],list2=[2,3], 我想得到的是。
[([0,2],[1,3]),([0,3],[2,1]),([2,1],[0,3]),([3,1],[2,0])],而使用N=2,我想得到[([2,3], [0,1])>。
我最初的想法是使用itertools.combinations(list1 list2,len(list1)),然后丟棄所有那些相差超過N元素的元素。這在原則上是可行的,但問題是list1和list2是相當長的,因此創建所有的組合是過度的和需要時間的,而N將是1到4之間的某個值。
我不介意使用陣列而不是串列來解決Scipy/numpy的問題。
PS:如果有人想知道,這是為量子化學服務的--我想找到所有可能的激發斯萊特行列式,用虛擬MO取代N占用的MO。
uj5u.com熱心網友回復:
我目前可以解決N=1的情況。我認為你不需要組合,而是需要乘積來概括任何N。
def paring(l1, l2)。
磁區 = []
for i1, v1 in enumerate(l1)。
for i2, v2 in enumerate(l2):
partitions = [(l1[:i1] [v2] l1[i1 1:], l2[i2 1:] [v1] l2[:i2]) ]
return磁區
def list2string(mylist)。
print('
'.join([''.join(p[0]) ' ' '. join(p[1]) for p in mylist] )
list2string(paring(['a1'/span>, 'a2'/span>], ['b1'/span>, 'b2'/span>, 'b3'])
輸出
b1a2 b2b3a1
b2a2 b3a1b1
b3a2 a1b1b2
a1b1 b2b3a2
a1b2 b3a2b1
a1b3 a2b1b2
uj5u.com熱心網友回復:
與其生成所有可能的組合并在之后進行過濾,你可以跟蹤已經進行了哪些交換,這樣就可以消除重復的遞回呼叫:
import copy
def swaps(d, s_w) 。
if not s_w:
yield tuple([tuple[k[1] if isinstance(k, tuple) else k for kin b]) for b in d])
else:
for i, a in enumerate(d):
for j, k in enumerate(a):
if not isinstance(k, tuple)。
for x, y in((x, y) for x, m in enumerate(d) for y。t in enumerate(m) if not isinstance(t, tuple) and x ! = i):
_d = copy.deepcopy(d)
_d[i][j] = (True, _d[x][y])
_d[x][y] = (True, k)
yield from swaps(_d, s_w - 1)
n, n2, list1, list2 = 1, 2, [0, 1], [2,3]
r = [*set(swaps([list1, list2], n)) ]
r1 = [*set(swaps([list1, list2], n2)) ]
輸出:
[((3, 1), (2, 0)),((0, 2),(1, 3)),((2, 1),(0, 3)),((0, 3),(2, 1))]
[((2, 3), (0, 1) )。((3, 2), (1, 0) ]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/309458.html
標籤:
