5

複数のリストを、各リストに表示される頻度の要素に従ってランク付けしたいと思います。例:

list1 = 1,2,3,4 list2
= 4,5,6,7
list3 = 4,1,8,9

結果=4,1,2,3,4,5,6,7,8(4は3回カウントされ、1は2回カウントされ、残りは1回カウントされます)

私は次のことを試しましたが、もっとインテリジェントなものと、任意の数のリストで実行できるものが必要です。


 l = []
 l.append([ 1, 2, 3, 4, 5])
 l.append([ 1, 9, 3, 4, 5])
 l.append([ 1, 10, 8, 4, 5])
 l.append([ 1, 12, 13, 7, 5])
 l.append([ 1, 14, 13, 13, 6])

 x1 = set(l[0]) & set(l[1]) & set(l[2]) & set(l[3])
 x2 = set(l[0]) & set(l[1]) & set(l[2]) & set(l[4])
 x3 = set(l[0]) & set(l[1]) & set(l[3]) & set(l[4])
 x4 = set(l[0]) & set(l[2]) & set(l[3]) & set(l[4])
 x5 = set(l[1]) & set(l[2]) & set(l[3]) & set(l[4])
 set1 = set(x1) | set(x2) | set(x3) | set(x4) | set(x5)

 a1 = list(set(l[0]) & set(l[1]) & set(l[2]) & set(l[3]) & set(l[4]))
 a2 = getDifference(list(set1),a1)
 print a1
 print a2

今ここに問題があります...私はa3、a4、a5で何度もそれを行うことができますが、それでは複雑すぎるので、これのための関数が必要です...しかし私は方法がわかりません...私の数学は行き詰まりました;)

解決済み:議論してくれてありがとう。初心者として、私はどういうわけかこのシステムが好きです:速い+有益です。あなたは私をすべて助けてくれました!Ty

4

6 に答える 6

7
import collections

data = [
  [1, 2, 3, 4, 5],
  [1, 9, 3, 4, 5],
  [1, 10, 8, 4, 5],
  [1, 12, 13, 7, 5],
  [1, 14, 13, 13, 6],
]

def sorted_by_count(lists):
  counts = collections.defaultdict(int)
  for L in lists:
    for n in L:
      counts[n] += 1

  return [num for num, count in
          sorted(counts.items(),
                 key=lambda k_v: (k_v[1], k_v[0]),
                 reverse=True)]

print sorted_by_count(data)

それでは、一般化して(反復可能で、ハッシュ可能な要件を緩めるため)、キーとリバースのパラメーターを許可して(ソート済みと一致させるため)、名前をfreq_sortedに変更しましょう:

def freq_sorted(iterable, key=None, reverse=False, include_freq=False):
  """Return a list of items from iterable sorted by frequency.

  If include_freq, (item, freq) is returned instead of item.

  key(item) must be hashable, but items need not be.

  *Higher* frequencies are returned first.  Within the same frequency group,
  items are ordered according to key(item).
  """
  if key is None:
    key = lambda x: x

  key_counts = collections.defaultdict(int)
  items = {}
  for n in iterable:
    k = key(n)
    key_counts[k] += 1
    items.setdefault(k, n)

  if include_freq:
    def get_item(k, c):
      return items[k], c
  else:
    def get_item(k, c):
      return items[k]

  return [get_item(k, c) for k, c in
          sorted(key_counts.items(),
                 key=lambda kc: (-kc[1], kc[0]),
                 reverse=reverse)]

例:

>>> import itertools
>>> print freq_sorted(itertools.chain.from_iterable(data))
[1, 5, 4, 13, 3, 2, 6, 7, 8, 9, 10, 12, 14]
>>> print freq_sorted(itertools.chain.from_iterable(data), include_freq=True)
# (slightly reformatted)
[(1, 5),
 (5, 4),
 (4, 3), (13, 3),
 (3, 2),
 (2, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1), (12, 1), (14, 1)]
于 2009-12-01T22:54:43.850 に答える
2

すでに投稿されているいくつかのアイデアを組み合わせる:

from itertools import chain
from collections import defaultdict

def frequency(*lists):
    counter = defaultdict(int)
    for x in chain(*lists):
        counter[x] += 1
    return [key for (key, value) in 
        sorted(counter.items(), key=lambda kv: (kv[1], kv[0]), reverse=True)]

ノート:

  1. CounterPython 2.7では、の代わりにを使用できますdefaultdict(int)
  2. このバージョンは、引数として任意の数のリストを取ります。先頭のアスタリスクは、それらがすべてタプルにパックされることを意味します。すべてのリストを含む単一のリストを渡す場合は、先頭のアスタリスクを省略します。
  3. リストにハッシュできないタイプが含まれている場合、これは機能しなくなります。
于 2009-12-01T23:29:44.473 に答える
1
def items_ordered_by_frequency(*lists):

    # get a flat list with all the values
    biglist = []
    for x in lists:
        biglist += x

    # sort it in reverse order by frequency
    return sorted(set(biglist), 
                  key=lambda x: biglist.count(x), 
                  reverse=True)
于 2009-12-01T23:01:38.017 に答える
0

各要素の出現数(ヒストグラム)を数え、それで並べ替えることができます。

def histogram(enumerable):
  result = {}
  for x in enumerable:
    result.setdefault(x, 0)
    result[x] += 1
  return result

lists = [ [1,2,3,4], [4,5,6,7], ... ]

from itertools import chain

h = histogram(chain(*lists))
ranked = sorted(set(chain(*lists)), key = lambda x : h[x], reverse = True)
于 2009-12-01T23:37:55.300 に答える
0

これを試してください:

def rank(*lists):
    d = dict()
    for lst in lists:
        for e in lst:
            if e in d: d[e] += 1
            else: d[e] = 1
    return [j[1] for j in sorted([(d[i],i) for i in d], reverse=True)]

使用例:

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

print rank(a,b,c)

入力として任意の数のリストを使用できます

于 2009-12-01T23:12:48.320 に答える
0

このコードを試してください:

def elementFreq(myList):
    #myList is the list of lists
    from collections import Counter
    tmp = []
    for i in myList: tmp += i        
    return(Counter(tmp))

注:リストはハッシュ可能なタイプである必要があります

于 2018-10-30T13:24:37.577 に答える