1

私は何年も離れてからプログラミングに戻ってきましたが、この問題に頭を悩ませています。ユーザーは分類セット量を定義していますが、RasterValue はリストの長さが N です

例: ClassificationSet = (1, 2, 3, 4, 5, 6) #ユーザーが
定義 RasterVal = () #length = N

ClassificationSet をインデックスとして使用してアイテムを RasterVal に保存します: RasterVal(ClassificationSet).add(Imported Value)

RasterVal(1) = 22,23,24,25,23,23,22
RasterVal(2) = 22,30,31,32,30,30
RasterVal(3) = 31

つまり: RasterVal([],[22,23,24,25,23,23,22], [22,30,31,32,30,30], [31])

繰り返される値をリストしたいのですが、同じセットではなく、異なるセットで繰り返される場合に限ります。

出力は次のようになります: RepeatSet = 22, 31

助けてくれてありがとう。セットを比較することはできましたが、同じセット リストに表示されている場合でも値が繰り返されます。

4

3 に答える 3

4

@lukecampbellは正しいです:

>>> lsts = [[22,23,24,25,23,23,22],[22,30,31,32,30,30],[31]]
>>> from collections import Counter
>>> c = Counter(x for lst in lsts for x in set(lst))
>>> [x for x,y in c.items() if y > 1]
[22, 31]

このアルゴリズムの実行時間は、セット数が 2 次ではなく、線形です。

于 2012-05-11T19:28:55.570 に答える
2
RasterVal = [[22,23,24,25,23,23,22],[22,30,31,32,30,30],[31]]

from itertools import combinations
out = set()
for a,b in combinations(RasterVal,2):
    out = out|(set(a)&set(b))

print out
#output:
set([22, 31])
于 2012-05-11T19:30:39.400 に答える
0
#-- Your initial data...
rasterVals = [
    (22,23,24,25,23,23,22),
    (22,30,31,32,30,30),
    (31,)
]

#-- This will be a set, which holds only distinct values.
repeated = set( )

#-- We set up a classic inner-outer loop to iterate over all 
#-- pairs of lists in your given data.  (Note, there are better ways
#-- of doing this in Python, but this is the easiest to read and understand)
for a in rasterVals:
    #-- First, we'll make a set from the first element.
    #-- Since sets only hold distinct values, any repeated numbers
    #-- in the sequence will be ignored.
    s = set(a)

    for b in rasterVals:
        #-- Test that we are not comparing a sequence to itself.
        if (a is not b):
            #-- Make a set for the inner loop. (again, only distinct numbers...)
            t = set(b)

            #-- Get the intersection of s and t, answering with only those elements
            #-- that are in both s and t.
            intersecting = (s & t)

            #-- We update our set of (inter-sequence) repeated elements.
            repeated.update(intersecting)

#-- Show the results.
print repeated
于 2012-05-11T19:22:53.060 に答える