5

次のような要素のリストが2つあります

a=[['10', 'name_1'],['50','name_2'],['40','name_3'], ..., ['80', 'name_N']]
b=[(10,40),(40,60),(60,90),(90,100)]

aには一連のデータが含まれており、bいくつかの間隔が定義されています。私の目的は、cの間隔と同じ数のリストを含むリストを作成することですb。の各リストには、区間に含まれる forcのすべてのx要素x[0]が含まれます。元:

c=[
[['10', 'name_1']],
[['50','name_2'],['40','name_3']],
[...,['80', 'name_N']]
]
4

4 に答える 4

1
c = []
for r in b:
    l = []
    rn = range(*r)
    for element in a:
        if int(element[0]) in rn:
            l.append(element)
    c.append(l)

間隔が非常に大きい場合は、xrange代わりに を使用することを検討してくださいrange。実際、間隔が適度に大きい場合でも、次のことを考慮してください。

c = []
for r in b:
    l = []
    for element in a:
        if r[0] <= int(element[0]) < r[1]:
            l.append(element)
    c.append(l)
于 2013-06-27T20:02:13.043 に答える
1

collections.defaultdictここでbisectモジュールを使用できます:

範囲は連続しているため、b 最初にリストを次のように変換することをお勧めします。

[10, 40, 60, 90, 100]

これの利点は、bisectモジュールを使用して、リストのアイテムが収まるインデックスを見つけることができるようになったことです。たとえば、50 は 40 と 60 の間にあるためbisect.bisect_right、この場合は 2 を返します。いいえ、この 2 をキーとして使用し、リストを値として保存できます。このようにして、 から返されたインデックスに基づいてこれらのアイテムをグループ化できますbisect.bisect_right

L_b = 2* len(b)
L_a = len(a)
L_b1 = len(b1)

全体的な複雑さは次のようになります。max ( L_b log L_b , L_a log L_b1 )

>>> import bisect
>>> from collections import defaultdict
>>> b=[(10,40),(40,60),(60,90),(90,100)]
>>> b1 = sorted( set(z for x in b for z in x))
>>> b1
[10, 40, 60, 90, 100]
>>> dic = defaultdict(list)
for x,y in a:
    #Now  find the index where the value from the list can fit in the 
    #b1 list, bisect uses binary search so this is an O(log n ) step.
    # use this returned index as key and append the list to that key.
    ind = bisect.bisect_right(b1,int(x))
    dic[ind].append([x,y])
...     
>>> dic.values()
[[['10', 'name_1']], [['50', 'name_2'], ['40', 'name_3']], [['80', 'name_N']]]

辞書には特定の順序がないため、並べ替えを使用して並べ替えられた出力を取得します。

>>> [dic[k] for k in sorted(dic)]
[[['10', 'name_1']], [['50', 'name_2'], ['40', 'name_3']], [['80', 'name_N']]]
于 2013-06-27T20:09:02.510 に答える
0

または、次のようにすることもできます。

>>> a=[['10', 'name_1'],['50','name_2'],['40','name_3'], ['80', 'name_N']]
>>> b=[(10,40),(40,60),(60,90),(90,100)]
>>> filter(None, [filter(lambda l: t[0]<=int(l[0])<t[1], a) for t in b])
[[['10', 'name_1']], [['50', 'name_2'], ['40', 'name_3']], [['80', 'name_N']]]
于 2013-06-27T21:13:22.990 に答える
0

あなたはこれを行うことができます:

>>> a=[['10', 'name_1'],['50','name_2'],['40','name_3'], ['80', 'name_N']]
>>> b=[(10,40),(40,60),(60,90),(90,100)]
>>> c=[]
>>> for t in b:
...    f=list(filter(lambda l: t[0]<=int(l[0])<t[1],a))
...    if f: c.append(f)
... 
>>> c
[[['10', 'name_1']], [['50', 'name_2'], ['40', 'name_3']], [['80', 'name_N']]]
于 2013-06-27T20:30:24.267 に答える