3
A = [a1, a2, a3...]  #a1<a2<a3...
B = [b1, b2...]  #b1<b2<b3...

A と B は互いに素です。要素の数と A/B の値は事前にわかりません。リスト要素と削除要素の両方の要素の値を比較したい場合:

delete a[i+1] if there is no b[j] such that a[i]<b[j]<a[i+1]
delete b[i+1] if there is no a[j] such that b[i]<a[j]<b[i+1]

最後に、AとBの組み合わせではなく、リストを分離したい.

たとえばA[0] < B[0]、A = [1, 10, 40]、B = [15, 30] の場合。比較A[1]してB[0]まず。10B の要素が 1 から 15 の間にないため削除します。次に、1515 と 30 の間に要素が存在しないため削除します。出力は次のようになります。新しい 2 つのリストの要素を並べ替えようとすると、次のようになります。A[0]<B[0]<A[1]<B[1]<...

の場合A[0] > B[0]、その逆。

4

4 に答える 4

1

あなたが編集する前に、私はこれを思いつきました。しかし、出力は期待したものではないようです。とにかく、正しい軌道に乗るのに役立つかもしれません:

a = range(0, 30, 3)
b = range(0, 20, 2)

a.sort()
b.sort()

A = [a[i+1] for i in range(len(a)-1) if any(a[i]<b[j]<a[i+1] for j in range(len(b)-1))]
B = [b[i+1] for i in range(len(b)-1) if any(b[i]<a[j]<b[i+1] for j in range(len(a)-1))]

result = sorted(A+B)

print a, b
print result

これは「文字通り」あなたが表現したものですが、resultここはあなたが期待するものではありません。これを改善してみます。

于 2012-07-18T08:16:29.950 に答える
1
a = [1, 10, 40]
b = [15, 30]

srcs = [a, b]
dsts = [[], []]
prev_which = -1
while all(srcs):
    which = int(srcs[0][0] > srcs[1][0])
    elem = srcs[which].pop(0)
    if prev_which != which:
        dsts[which].append(elem)
    prev_which = which
for src, dst in zip(srcs,dsts):
    if src:
        dst.append(src.pop(0))
a, b = dsts

戻り値:

a = [1, 40]
b = [15]

そして

a = [3, 4, 6, 7, 8, 9]
b = [1, 2, 5, 10]

[3, 6]とを返します[1, 5, 10]

編集:別の可能性:

import itertools as it
import operator as op

a = [3, 4, 6, 7, 8, 9]
b = [1, 2, 5, 10]
srcs = [a, b]
dsts = [[], []]

for which, elems in it.groupby(sorted((x, i) for i in (0,1) for x in srcs[i]), key=op.itemgetter(1)):
    dsts[which].append(next(elems)[0])
a, b = dsts
于 2012-07-18T08:25:22.550 に答える
0

したがって、私が正しく読んでいれば、あなたの例からの望ましい出力は[1,40]と[15]ですよね?

もしそうなら、以下は正しい結果を得るでしょうが、それを行うためのより厳密な方法があると確信しています.

a = [1, 10, 40]
b = [15, 30]
c = sorted([[e_a,'a'] for e_a in a] + [[e_b,'b'] for e_b in b])
indices = []

for i in range(len(c)-1):
    if c[i][1] == c[i+1][1]:
        indices.append(i+1)

for e in sorted(indices, reverse=True):
    del c[e]

a,b = [e[0] for e in c if e[1]=='a'],[e[0] for e in c if e[1]=='b']

最初 - どのリストから来たかを追跡しながら、リストをマージして並べ替えます。

2 番目 - 次に、マージされたリストの次の項目が同じソース リストからのものであるすべてのインスタンスを削除します。

3 番目 - a と b を更新します。

于 2012-07-18T14:30:38.297 に答える