Cum se împarte un șir de caractere folosind un separator gol în Python (Programare, Python, String, Split)

Saullo G. P. Castro a intrebat.
a intrebat.

Care este o modalitate bună de a face some_string.split('') în python? Această sintaxă dă o eroare:

a = '1111'
a.split('')

ValueError: empty separator

Aș dori să obțin:

['1', '1', '1', '1']

Comentarii

  • Chiar trebuie să faceți asta? De cele mai multe ori, puteți trata un șir de caractere în același mod în care tratați o listă oricum. –  > Por arshajii.
  • Am încercat să fac asta și a dat această eroare, așa că m-am gândit că ar fi frumos să o includ aici ca întrebare –  > Por Saullo G. P. Castro.
  • S-ar putea să vă intereseze și acest lucru – Modalitate alternativă de a împărți o listă în grupuri de n. – –  > Por Cristian Ciupitu.
  • @sqpc: Nu, nu ar da „această eroare”, deci nu ai încercat asta. Ai încercat să nu faci nimic? Să nu o împarți deloc? –  > Por Lennart Regebro.
  • @arshajii contrar spuselor tale „în cea mai mare parte a timpului „, obiectul ‘str’ nu acceptă atribuirea de elemente. Acest lucru umple nevoia. –  > Por brainLoop.
5 răspunsuri
TerryA

Utilizați list():

>>> list('1111')
['1', '1', '1', '1']

Alternativ, puteți folosi map() (numai în Python 2.7):

>>> map(None, '1111')
['1', '1', '1', '1']

Diferențe de timp:

$ python -m timeit "list('1111')"
1000000 loops, best of 3: 0.483 usec per loop
$ python -m timeit "map(None, '1111')"
1000000 loops, best of 3: 0.431 usec per loop

oleg

Se pot transforma direct șirurile de caractere în liste

>>> list('1111')
['1', '1', '1', '1']

sau folosind înțelegeri de liste

>>> [i for i in '1111']
['1', '1', '1', '1']

a doua modalitate poate fi utilă dacă se dorește divizarea șirurilor pentru subșiruri cu o lungime mai mare de 1 simbol

>>> some_string = '12345'
>>> [some_string[i:i+2] for i in range(0, len(some_string), 2)]
['12', '34', '5']

Lennart Regebro

Șirurile de caractere sunt iterabile și pot fi indexate, prin urmare, nu este nevoie să le divizați deloc:

>>> for char in '11111':
...   print char
... 
1
1
1
1
1
>>> '11111'[4]
'1'

Puteți să le „împărțiți” cu un apel la lista, dar acest lucru nu face o mare diferență:

>>> for char in list('11111'):
...   print char
... 
1
1
1
1
1
>>> list('11111')[4]
'1'

Așadar, trebuie să faceți acest lucru doar dacă codul dvs. se așteaptă în mod explicit la o listă. De exemplu:

>>> list('11111').append('2')
>>> l = list('11111')
>>> l.append(2)
>>> l
['1', '1', '1', '1', '1', 2]

Acest lucru nu funcționează cu un șir direct:

>>> l.append('2')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'append'

În acest caz, ar trebui să aveți nevoie de:

>>> l += '2'
>>> l
'111112'

Amalraj Victory

Metoda #1:

s="Amalraj"
l=[i for i in s]
print(l)

Ieșire:

['A', 'm', 'a', 'l', 'r', 'a', 'j']

Metoda #2:

s="Amalraj"
l=list(s)
print(l)

Ieșire:

['A', 'm', 'a', 'l', 'r', 'a', 'j']

Metoda #3:

import re; # importing regular expression module
s="Amalraj"
l=re.findall('.',s)
print(l)

Ieșire:

['A', 'm', 'a', 'l', 'r', 'a', 'j']

Erwan Daniel

Dacă la fel ca mine ați ajuns aici pentru a împărți în pachete și nu char cu char, am făcut acest :

>>> n=2
>>> str='423346396677674A446E6838436E304164334A30427874784467567863334942446E41424E413D3D'
>>> [ str[byte:byte+n] for byte in range(0,len(str)) if byte % n == 0 ]
['42', '33', '46', '39', '66', '77', '67', '4A', '44', '6E', '68', '38', '43', '6E', '30', '41', '64', '33', '4A', '30', '42', '78', '74', '78', '44', '67', '56', '78', '63', '33', '49', '42', '44', '6E', '41', '42', '4E', '41', '3D', '3D']