Python | Poimi numerot merkkijonosta

Useita kertoja, kun työskentelemme merkkijonojen kanssa, törmäämme tähän ongelmaan, jossa meidän on saatava kaikki numeeriset esiintymät. Tämän tyyppisiä ongelmia esiintyy yleensä kilpailullisessa ohjelmoinnissa ja myös web-kehityksessä. Keskustellaan tietyistä tavoista, joilla tämä ongelma voidaan ratkaista Python .

  Input:   'There are 2 apples for 4 persons'   Output:   [2, 4]   Explanation:   2 and 4 are the only number present in the input string. 

Poimi numerot merkkijonosta Pythonissa

Alla on menetelmät, joita käsittelemme tässä artikkelissa:

  • Käyttämällä Listan ymmärtäminen ja isdigit() menetelmä
  • Käyttämällä re.findall() menetelmä
  • Käyttämällä isnumeric() menetelmä
  • Käyttämällä Suodattaa() toiminto
  • Käyttämällä silmukkaa ja isdigit() menetelmä
  • Käyttämällä str.translate() kanssa str.maketrans()
  • Käyttämällä nuhjuinen moduuli

Poimi numerot merkkijonosta käyttämällä luettelon ymmärtämistä ja isdigit() menetelmä

Tämä ongelma voidaan ratkaista käyttämällä split-funktiota muuntamalla merkkijono luetteloksi ja sitten listan ymmärtäminen joka voi auttaa meitä toistamaan luetteloa ja isdigit toiminto auttaa saamaan numeron pois merkkijonosta.

Python 3




test_string> => 'There are 2 apples for 4 persons'> # printing original string> print> (> 'The original string : '> +> test_string)> # using List comprehension + isdigit() +split()> # getting numbers from string> res> => [> int> (i)> for> i> in> test_string.split()> if> i.isdigit()]> # print result> print> (> 'The numbers list is :'> +> str> (res))>

Lähtö

The original string : There are 2 apples for 4 persons The numbers list is :[2, 4] 

Aika monimutkaisuus: O(n), missä n on syötemerkkijonon elementtien lukumäärä.
Aputila: O(n), missä n on syötemerkkijonon numeroiden lukumäärä.

Pura numero merkkijonosta käyttämällä re.findall() menetelmä

Tämä ongelma voidaan ratkaista myös Pythonilla regex, voimme käyttää Findall-toiminto tarkistaaksesi numeeriset esiintymät käyttämällä vastaavaa regex-merkkijonoa.

Python 3




import> re> # initializing string> test_string> => 'There are 2 apples for 4 persons'> # printing original string> print> (> 'The original string : '> +> test_string)> # getting numbers from string> temp> => re.findall(r> 'd+'> , test_string)> res> => list> (> map> (> int> , temp))> # print result> print> (> 'The numbers list is : '> +> str> (res))>

Lähtö

The original string : There are 2 apples for 4 persons The numbers list is : [2, 4] 

Pura Interger merkkijonosta käyttämällä isnumeric()-menetelmää

Pythonissa meillä on on numeerinen funktio, joka voi kertoa käyttäjälle, onko tietty elementti numero vai ei, joten tällä menetelmällä voimme myös poimia numeron merkkijonosta.

Python 3




test_string> => 'There are 2 apples for 4 persons'> # printing original string> print> (> 'The original string : '> +> test_string)> # getting numbers from string> res> => []> x> => test_string.split()> for> i> in> x:> > if> i.isnumeric():> > res.append(> int> (i))> # print result> print> (> 'The numbers list is : '> +> str> (res))>

Lähtö

The original string : There are 2 apples for 4 persons The numbers list is : [2, 4] 

Aika monimutkaisuus: O(N)
Aputila: O(N)

Pura numero merkkijonosta Filter()-funktiolla

Ensin määritetään syöttömerkkijono, sitten tulostetaan alkuperäinen merkkijono ja jaetaan syöttömerkkijono sanaluetteloksi käyttämällä jakaa() menetelmä. Käytä suodattaa() toiminto suodattaa ei-numeeriset elementit luettelosta käyttämällä lambda-toiminto x .isdigit() jokaiseen elementtiin Muunna suodatetun luettelon loput elementit kokonaisluvuiksi käyttämällä luettelon ymmärtämistä

Tulosta tuloksena oleva kokonaislukuluettelo

Python 3




test_string> => 'There are 2 apples for 4 persons'> print> (> 'The original string : '> +> test_string)> # use the split() method to split> # use the filter() function to filter out non-numeric elements from the list> res> => list> (> filter> (> lambda> x: x.isdigit(), test_string.split()))> # use a list comprehension to convert the remaining elements to integers> res> => [> int> (s)> for> s> in> res]> # print the resulting list of integers> print> (> 'The numbers list is : '> +> str> (res))>

Lähtö

The original string : There are 2 apples for 4 persons The numbers list is : [2, 4] 

Aika monimutkaisuus: O(n), missä n on syötetyn merkkijonon pituus. Split()-menetelmässä kuluu O(n) aikaa jakaa syöttömerkkijono sanaluetteloksi, ja filter()-funktiolla kuluu O(n) aikaa iteroidakseen luettelon jokaisen elementin ja käyttääkseen lambda-funktiota. Listan ymmärtäminen vie O(k) aikaa, missä k on niiden alkioiden lukumäärä suodatetussa listassa, jotka ovat numeroita, ja tämä on tyypillisesti paljon pienempi kuin n. Siksi kokonaisaika monimutkaisuus on O(n).

Aputilan monimutkaisuus: O(n), koska split()-menetelmä luo listan sanoista, jotka ovat yhtä pitkiä kuin syötemerkkijono, ja filter()-funktio luo suodatetun listan, joka voi olla jopa yhtä pitkä kuin syöttöluettelo. Listan ymmärtäminen luo uuden kokonaislukulistan, joka on tyypillisesti paljon pienempi kuin syöteluettelo, mutta avaruuden monimutkaisuus on silti O(n) pahimmassa tapauksessa. Siksi aputilan kokonaismonimutkaisuus on O(n)

Pura Interger merkkijonosta käyttämällä silmukkaa ja isdigit()-metodia

Käytä silmukkaa toistaaksesi merkkijonon jokaista merkkiä ja tarkista, onko se numero isdigit() menetelmä. Jos se on numero, lisää se luetteloon.

Python 3




test_string> => 'There are 2 apples for 4 persons'> numbers> => []> for> char> in> test_string:> > if> char.isdigit():> > numbers.append(> int> (char))> print> (> 'The numbers list is:'> , numbers)>

Lähtö

The numbers list is: [2, 4] 

Aika monimutkaisuus: O(n), missä n on merkkijonon pituus.
Aputila: O(k), missä k on merkkijonon numeroiden lukumäärä.

Pura numerot merkkijonosta käyttämällä str.translate() ja str.maketrans()

Määritä syötemerkkijono ja alusta sitten käännöstaulukko poistaaksesi ei-numeeriset merkit käyttämällä str. maketrans() . Käyttää str. Kääntää() käännöstaulukon kanssa poistaaksesi ei-numeeriset merkit merkkijonosta ja tallentaaksesi tuloksen uuteen merkkijonoon, jota kutsutaan numeerinen_merkkijono . Käyttää str. jakaa() jakaa numeerinen_merkkijono sanaluetteloon ja tallenna tulos uuteen luetteloon nimeltä sanat. Alusta tyhjä luettelo, jota kutsutaan numeroiksi, tallentaaksesi tuloksena olevat kokonaisluvut ja toista sitten sanaluettelon jokaisen sanan yli. Tarkista, onko sana numeerinen merkkijono käyttämällä str. isdigit() .Jos sana on numeerinen merkkijono, muunna se kokonaisluvuksi käyttämällä int() ja liitä se numeroluetteloon.

Tulosta tuloksena oleva kokonaislukuluettelo.

Alla on yllä olevan lähestymistavan toteutus:

Python 3




# Define the input string> test_string> => 'There are 2 apples for 4 persons'> # Print the original string> print> (> 'The original string : '> +> test_string)> # Initialize a translation table to remove non-numeric characters> translation_table> => str> .maketrans('> ', '> ', '> abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!'> #$%&'()*+,-./:;?@[]^_`~')> # Use str.translate() with the translation table to remove non-numeric characters> numeric_string> => test_string.translate(translation_table)> # Use str.split() to split the string into a list of word> words> => numeric_string.split()> numbers> => [> int> (i)> for> i> in> words]> print> (> 'The numbers list is : '> +> str> (numbers))>

Lähtö

The original string : There are 2 apples for 4 persons The numbers list is : [2, 4] 

Aika monimutkaisuus: O(n), missä n on syötetyn merkkijonon pituus. Str.translate()- ja str.split()-metodit vievät O(n) aikaa, ja sanaluettelon jokaisen sanan iterointi kestää O(k) aikaa, missä k on niiden sanojen määrä luettelossa, jotka ovat numeeriset merkkijonot.
Aputila: O(n), kun luomme uuden merkkijonon ja uuden luettelon sanoista, joilla kullakin on sama pituus kuin syötetyn merkkijonon, ja luomme uuden luettelon kokonaisluvuista, joiden enimmäispituus on k, missä k on listan sanat, jotka ovat numeerisia merkkijonoja.

Pura numerot merkkijonosta numpy-moduulilla

Alusta merkkijono test_string ja jaa sitten merkkijono sanaluetteloksi split-menetelmällä ja luo nuhjuinen taulukko x tuloksena olevasta luettelosta. Käytä np.char .isnumeric luodaksesi loogisen maskin, joka osoittaa mitkä x:n elementit ovat numeerisia. Käytä tätä Boolen maskia indeksoidaksesi x ja poimiaksesi vain numeeriset elementit. Muunna tuloksena oleva merkkijonosarja kokonaislukujen joukoksi käyttämällä tyyppi.

Tulosta tuloksena oleva kokonaislukutaulukko.

Python 3




import> numpy as np> # initializing string> test_string> => 'There are 2 apples for 4 persons'> # printing original string> print> (> 'The original string : '> +> test_string)> # getting numbers from string using numpy> x> => np.array(test_string.split())> res> => x[np.char.isnumeric(x)].astype(> int> )> # print result> print> (> 'The numbers list is : '> +> str> (res))> #This code is contributed by Vinay Pinjala.>

Lähtö:

The original string : There are 2 apples for 4 persons The numbers list is : [2 4] 

Aika monimutkaisuus: O(n), missä n on alkuperäisen merkkijonon testijono pituus. Tämä johtuu siitä, että split-menetelmällä kestää O(n) aikaa jakaa merkkijono sanaluetteloksi ja np.char.isnumeric-menetelmällä O(n) aikaa loogisen maskin luomiseen. Loput toiminnot vievät jatkuvasti aikaa.

Aputila: O(n), missä n on alkuperäisen merkkijonon testijono pituus. Tämä johtuu siitä, että luomme numpy-taulukon x tallentamaan merkkijonon sanat, mikä vie O(n) tilaa. Tuloksena olevan numpy kokonaislukutaulukon käyttämä tila on myös O(n), koska se sisältää kaikki merkkijonon numeeriset elementit.