Python - uitstrekt en vullen lijst met nullen aan andere lijst overeenkomen

stemmen
1

Ik heb een lijst amet een paar elementen. Ik heb nog een lijst bmet meer elementen. Ik nodig om uit te breiden aaan te passen bin grootte, met behulp van nullen in te vullen. In de nieuwe lijst die zal komen, het origineel aligt in een positie bepaald door b, zoals door voorbeeld in het volgende.
Klein voorbeeld van mijn situatie:

a = [3, 4, 5]

b = [1.2, 2.5, 3.7, 4.3, 5.1, 6.3, 7.3, 8.9]

ik heb nodig

[0, 0, 3, 4, 5, 0, 0, 0]

De eerste niet-nul element derde plaats hier aan te passen indien bgelijk aan of groter dan 3 is, en evenzo de laatste niet-nul element vijfde plaats als resultaat van de vergelijking b.

Het eindresultaat is steeds len(b); als er te veel nullen aan het begin om alle passen a, dan elementen uit azijn gedaald.

De vraag is gesteld op 07/10/2017 om 14:48
user
In andere talen...                            


4 antwoorden

stemmen
1
a = [3, 4, 5]
b = [1.2,2.5,3.7,4.3,5.1,6.3,7.3,8.9]

b.sort()  # Ensure they are sorted

start_zero_till = len(b) - len(a)
for i in range(len(b)):
    if a[0] < b[i]:
        start_zero_till = i
        break

revised_a = [0] * start_zero_till
revised_a.extend(a)
revised_a.extend([0] * (len(b) - len(revised_a)))

print(revised_a)
antwoordde op 07/10/2017 om 15:00
bron van user

stemmen
1

Met tweedeling naar de eerste positie voorbeeld bgroter dan of gelijk aan a[0], de bisectmodule

import bisect

def zero_pad(a, b):
    pos = bisect.bisect(b, a[0])
    remainder = len(b) - len(a) - pos
    return ([0] * pos + a + [0] * remainder)[:len(b)]

Bisection kunt u het punt in O (LOGN) tijd te vinden.

Een alternatief is om een generator functie; lus over ben de opbrengst 0is tot een gelijke of grotere waarde a[0]wordt gevonden, wordt verkregen atot uitgeput en terug naar nul:

def zero_pad_gen(a, b, _sentinel=object()):
    a = iter(a)
    nexta = next(a, _sentinel)
    for bval in b:
        if nexta is _sentinel or bval < nexta:
            yield 0
        else:
            yield nexta
            nexta = next(a, _sentinel)

demo:

>>> a = [3, 4, 5]
>>> b = [1.2, 2.5, 3.7, 4.3, 5.1, 6.3, 7.3, 8.9]
>>> zero_pad(a, b)
[0, 0, 3, 4, 5, 0, 0, 0]
>>> list(zero_pad_gen(a, b))
[0, 0, 3, 4, 5, 0, 0, 0]

en in extreme gevallen; bte kort, te laten vallen waarden uit a:

>>> zero_pad(a, b[:-4])
[0, 0, 3, 4]
>>> list(zero_pad_gen(a, b[:-4]))
[0, 0, 3, 4]

Eerste waarde van bmatching:

>>> zero_pad([1, 2] + a, b)
[1, 2, 3, 4, 5, 0, 0, 0]
>>> list(zero_pad_gen([1, 2] + a, b))
[1, 2, 3, 4, 5, 0, 0, 0]
antwoordde op 07/10/2017 om 15:01
bron van user

stemmen
1

Probeer dit

for i in b:
    if int(i) not in a:
        a.insert(b.index(i),0)
antwoordde op 07/10/2017 om 16:11
bron van user

stemmen
0

Je zou kunnen proberen dit met overzicht comprehensies

a = [3, 4, 5]
b = [1.2, 2.5, 3.7, 4.3, 5.1, 6.3, 7.3, 8.9]
num=[c for c,e in enumerate(b) if e>=a[0]][0]
c=[0 for e in range(num)]+a+[0 for e in range(len(b)-num-len(a))]
print(c)
antwoordde op 07/10/2017 om 16:48
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more