8

次のようなリストがあります。

 all = [[a,b,c,d],[r,d,g,s],[e,r,a,b],[p,o,i,u]....(more similar items)]

その中で同じものが何個あるか知りたいので、 と比較してから で比較しall[0]、次にで比較する必要があります。all[1],all[2]...all[(len(all)-1)]all[1]all[2],all[3]...all[(len(all)-1)]all[2]all[3],all[4],...all[(len(all)-1)]

私はこのようなことを試しました:

 for i in range(len(all)):
     print len(all[i] & all[i+1]) ##how many identical items shared by all[0] and all[1]
     print len(all[i+1] & all[i+2])

しかし、続行する方法がわかりません。取得したい結果は次のとおりです。

item1 has 3 same values with item2, 
      has 4 same values with item3,
      has 1 same values with item4....

item2 has 3 same values with item1,
      has 2 same values with item3,
      etc
4

4 に答える 4

4

ここで最も単純なアルゴリズムはan^2です。リストを2回ループするだけです。

for x, left in enumerate(all):
    for y, right in enumerate(all):
        common = len(set(left) & set(right))
        print "item%s has %s values in common with item%s"%(x, common, y)
于 2012-08-10T13:32:57.303 に答える
2

セットは行く方法です。. .

 
all = [[1,2,3,4],[1,2,5,6],[4,5,7,8],[1,8,3,4]]
set_all = [set(i) for i in all]
for i in range(len(all)):
    for j in range(len(all)):
        if i == j: 
            continue
        ncom = len(set_all[i].intersection(set_all[j]))
        print "List set %s has %s elements in common with set %s" % (i, ncom, j)

List set 0 has 2 elements in common with set 1 List set 0 has 1 elements in common with set 2 List set 0 has 3 elements in common with set 3 List set 1 has 2 elements in common with set 0 List set 1 has 1 elements in common with set 2 List set 1 has 1 elements in common with set 3 List set 2 has 1 elements in common with set 0 List set 2 has 1 elements in common with set 1 List set 2 has 2 elements in common with set 3 List set 3 has 3 elements in common with set 0 List set 3 has 1 elements in common with set 1 List set 3 has 2 elements in common with set 2

于 2012-08-10T13:41:08.657 に答える
1

基本的にやりたいことは、各リスト内の要素のセットと他のリストとの交点の長さを数えることです。これを試して:

a = [['a','b','c','d'],['r','d','g','s'],['e','r','a','b'],['p','o','i','u']]

for i in range(len(a)):
   for j in range(len(a)):
      print "item%d has %d same values as item%d" % ( i, len(set(a[i]) & set(a[j])) ,j )

出力形式は、まさにあなたが望んでいたものではありませんが、アイデアは得られます。

于 2012-08-10T13:34:31.307 に答える
0

あなたが私のような怠け者なので、最短の答えを探しているなら:)

>>> my_list = [['a','b','c','d'],['r','d','g','s'],['e','r','a','b'],['p','o','i','u']]
>>> for i, sub_list in enumerate(my_list):
...     print 'item %d shares with %r'%(i, map(lambda a, b: len(set(a) & set(b)), sub_list, my_list))
...
item 0 shares with [1, 0, 0, 0]
item 1 shares with [0, 1, 0, 0]
item 2 shares with [0, 1, 1, 0]
item 3 shares with [0, 0, 0, 1]
于 2012-08-10T13:58:02.530 に答える