การแทนที่ค่าในรายการเป็นระยะ

Riley 09/25/2018. 8 answers, 1.903 views
python list replace

สมมติว่าฉันมีรายการต่อไปนี้ใน Python:

my_list = [10] * 95 

รับ n ฉันต้องการแทนที่องค์ประกอบ m อื่น ๆ ด้วยศูนย์ในรายการของฉันในขณะที่ยังคงองค์ประกอบ n ถัดไป

ตัวอย่างเช่นถ้า n = 3 และ m = 2 ฉันต้องการให้รายการของฉันดูเหมือน:

[10, 10, 10, 0, 0, 10, 10, 10 ,0, 0, ..., 10, 10, 10 , 0, 0] 

ถ้ามันไม่สามารถเติมเต็มได้อย่างสมบูรณ์แบบเช่นเดียวกับ n = 4 และ m = 2 มันก็โอเคถ้ารายการของฉันเป็นแบบนี้:

[10, 10, 10, 10, 0, 0, ..., 10, 10, 10, 10, 0] 

ฉันควรพยายามแก้ไขปัญหานี้อย่างไร

8 Answers


Alfe 09/25/2018.
my_list = [10] * 95
n = 3
m = 2
for i in range(m):
    my_list[n+i::m+n] = [0] * len(my_list[n+i::m+n]) 

นี่แค่ต้องการการมอบหมาย m เพื่อทำงาน (และ m อาจมีขนาดเล็ก)

หากคุณมีค่าที่เป็นไปได้สองค่า (เช่น 10 และ 0) คุณสามารถทำได้ง่ายกว่า:

my_list = [ 10 if i % (n+m) < n else 0 for i in range(95) ] 

แต่มันซ้ำใน Python ตลอดช่วงทั้งหมด 95 ดังนั้นอาจไม่เร็วมาก

ซับซ้อนกว่าเล็กน้อย แต่อาจมีประสิทธิภาพมากกว่า (โดยเฉพาะอย่างยิ่งสำหรับรายการขนาดใหญ่และค่ามากสำหรับ n และ m ) คือ:

my_list = (([ 10 ] * n + [ 0 ] * m) * (95 // (n + m) + 1))[:95] 

แต่มันสร้างรายการภายในจำนวนมากดังนั้นจึงขึ้นอยู่กับการทดสอบเพื่อดูว่าสิ่งนี้มีประสิทธิภาพในกรณีของคุณหรือไม่ (ควรคำนึงถึงการใช้หน่วยความจำสำหรับรายการขนาดใหญ่ด้วย)

หากคุณสามารถใช้ numpy (คำถามเล็กน้อย แต่เนื่องจากมันแพร่หลาย):

my_list = (np.arange(95) % (n+m) < n) * 10 

Aran-Fey 09/25/2018.

คุณสามารถใช้ itertools.cycle เพื่อสร้างลำดับที่ไม่มีที่สิ้นสุดของ [10, 10, 10, 0, 0] จากนั้นรับองค์ประกอบแรก 95 ของลำดับนั้นด้วย itertools.islice

n = 3
m = 2

pattern = [10] * n + [0] * m
my_list = list(itertools.islice(itertools.cycle(pattern), 95)) 

Eric Duminil 09/25/2018.

ยังมีความเป็นไปได้อื่นคราวนี้พร้อม enumerate :

[x * (i % (n + m) < n) for i, x in enumerate(my_list)] 

มันใช้ความจริงที่ว่า False และ True เท่ากับ 0 และ 1 ใน Python (ดู ที่นี่ )

เป็นโบนัสมันใช้งานได้ดีแม้ว่ารายการจะไม่คงที่:

>>> n = 4
>>> m = 2
>>> my_list = range(20)
>>> [x * (i % (n+m) < n) for i, x in enumerate(my_list)]
[0, 1, 2, 3, 0, 0, 6, 7, 8, 9, 0, 0, 12, 13, 14, 15, 0, 0, 18, 19] 

หากรายการมีสตริงมันจะแทนที่ด้วยสตริงว่างแทน 0 :

>>> my_list = 'abcdefghijk'
>>> [x * (i % (n+m) < n) for i, x in enumerate(my_list)]
['a', 'b', 'c', 'd', '', '', 'g', 'h', 'i', 'j', ''] 

Shintlor 09/25/2018.

สิ่งนี้ใช้ได้กับฉัน:

list = [10] * 95

n = 4
m = 2

amask = np.tile(np.concatenate((np.ones(n),np.zeros(m))),int((len(list)+1)/(n+m)))[:len(list)]

list = np.asarray(list)*amask 

ผลลัพธ์ใด:

array([10., 10., 10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,  0., 10.,
       10., 10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,  0., 10., 10.,
       10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,  0., 10., 10., 10.,
       10.,  0.,  0., 10., 10., 10., 10.,  0.,  0., 10., 10., 10., 10.,
        0.,  0., 10., 10., 10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,
        0., 10., 10., 10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,  0.,
       10., 10., 10., 10.,  0.,  0., 10., 10., 10., 10.,  0.,  0., 10.,
       10., 10., 10.,  0.]) 

รหัสใช้เวลา n และ m และสร้างรูปแบบของหนึ่งและศูนย์ด้วยความยาวที่ตรงกับ list เริ่มต้นของคุณโดยใช้ฟังก์ชัน np.tile หลังจากนั้นคุณเพียงแค่เพิ่มหน้ากากลงในรายการและรับค่าศูนย์ที่คุณต้องการให้เป็น มันควรจะยืดหยุ่นกับความยาวที่แตกต่างกันของรายการและตัวเลือก (และเกือบ) โดยพลการของ n และ m

คุณสามารถส่งอาร์เรย์กลับไปยังรายการได้ถ้าต้องการ


klim 09/25/2018.

แล้วเรื่องนี้ล่ะ

my_list = [10] * 95
n = 3
m = 2

for i in range(n, len(my_list)-1, n+m):
    my_list[i:i+m] = [0]*m

print(my_list) 

แก้ไข

ฉันพบว่ารหัสข้างต้นเปลี่ยนความยาวของรายการผลลัพธ์ในบางกรณี

>>> a = [1,2,3]
>>> a[2:4] = [0] * 2
>>> a
[1, 2, 0, 0] 

ดังนั้นความยาวควรจะคืนค่าอย่างใด

my_list = [10] * 95
cp_list = list(my_list)
n = 3
m = 5

for i in range(n, len(my_list)-1, n+m):
    cp_list[i:i+m] = [0]*m

cp_list = cp_list[:len(my_list)]
print(cp_list) 

timgeb 09/25/2018.

numpy สามารถทำสิ่งนี้ได้อย่างกระชับเช่นกัน!

a = np.array(my_list).reshape(-1, n + m)
a[:, n:] = 0
result = a.ravel().tolist() 

Moonsik Park 09/25/2018.
[j for i in [[input_num] * n + [0] * m for x in range(int(num / (m + n)) + 1)][:num] for j in i] 

อาจจะ?

ผล

>>> num, input_num, m, n=95, 10, 2, 3
>>> [j for i in [[input_num] * n + [0] * m for x in range(int(num / (m + n)) + 1)][:num] for j in i]
[10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10, 10, 10, 0 , 0, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0] 

pylang 10/02/2018.

นอกจากนี้ในตระกูล itertools คุณสามารถ repeat รูปแบบที่ต้องการ:

Given

import itertools as it


m, n = 2, 3
p = n + 1 

Code

pattern = it.repeat([10] * n + [0] * m)
res = list(it.islice(it.chain.from_iterable(pattern), None, 95))
print(res)
# [10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 0, 0, ... 10, 10, 10, 10, 0, 0] 

pattern = it.repeat([10] * p + [0] * m)
res = list(it.islice(it.chain.from_iterable(pattern), None, 95))
print(res)
# [10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 0, 0, ... 10, 10, 10, 10, 0] 

ทดสอบ

assert len(res) == 95 

อย่างไรก็ตามโซลูชัน itertools.cycle ของ @ Aran-Fey นั้นสะอาดกว่าเพราะไม่ต้องการการผูกมัด


HighResolutionMusic.com - Download Hi-Res Songs

1 AJR

Birthday Party flac

AJR. 2019. Writer: Adam Met;Jack Met;Ryan Met;Peter Ivers;David Lynch.
2 Loote

Your Side Of The Bed flac

Loote. 2018. Writer: ​Jesse Saint John;Jackson Foote;Emma Lov Block.
3 AJR

100 Bad Days flac

AJR. 2019. Writer: Jack Met;Adam Met;Ryan Met.
4 Joe Jonas

Longer Than I Thought flac

Joe Jonas. 2018. Writer: Patrick Nissley;Jackson Foote;Dave Katz.
5 Loote

Out Of My Head flac

Loote. 2018. Writer: Emma Lov Block;Michael Pollack;Jeremy Dussolliet;Jackson Foote.
6 Iselin Solheim

Anyone Out There flac

Iselin Solheim. 2019. Writer: Iselin Solheim;Max Grahn.
7 Loote

Wish I Never Met You flac

Loote. 2018. Writer: Jackson Foote;Alex Peter Koste;Jeremy Dussolliet;Emma Lov Block.
8 Kim Petras

Heart To Break flac

Kim Petras. 2018. Writer: Cirkut;Aaron Joseph;Dr. Luke;Jacob Kasher;Kim Petras.
9 A L E X

Out On The Trampoline At Night flac

A L E X. 2018. Writer: A L E X.
10 A L E X

I Want To Hold Your Hand flac

A L E X. 2018. Writer: A L E X.
11 A L E X

Field flac

A L E X. 2018. Writer: A L E X.
12 A L E X

Save Me flac

A L E X. 2018. Writer: A L E X.
13 Devin

Summer Lover flac

Devin. 2019. Writer: Tommy Lee James;Stuart Crichton;Oliver Heldens;Nile Rodgers;Devin Guisande.
14 A L E X

9 To 5 flac

A L E X. 2018. Writer: A L E X.
15 A L E X

Skirt flac

A L E X. 2018. Writer: A L E X.
16 Florian Picasso

Midnight Sun (Extended Version) flac

Florian Picasso. 2019.
17 Florian Picasso

Midnight Sun flac

Florian Picasso. 2019.
18 21 Savage

Enzo flac

21 Savage. 2019. Writer: YungLunchBox;Sheck Wes;Offset;Gucci Mane;21 Savage;DJ Snake.
19 Tales Of Ratatösk

Battle Of The Doomed Gods 320kbps

Tales Of Ratatösk. 2019.
20 Tales Of Ratatösk

Andro 320kbps

Tales Of Ratatösk. 2019.

Related questions

Hot questions

Language

Popular Tags