2017-01-24 2 views
0

Wie würde ich konvertieren die folgende Liste:Convert Liste der Tupel Strings Tupel in Python

start = ['foo 1/ bar 2', 'foo 2/ bar 3', 'foo 34/ bar 45'] 

auf die folgende Liste von Tupeln:

finish = [(1,2), (2,3), (34,45)] 

ich einen Versuch mit dieser begann:

finish = tuple([x.translate(None,'foobar ').replace('/',',') for x in start]) 

aber immer noch nicht abgeschlossen und es wird hässlich.

Antwort

2
start = ['foo 1/ bar 2', 'foo 2/ bar 3', 'foo 34/ bar 45'] 
finish = [(int(b[:-1]), int(d)) for a, b, c, d in map(str.split, start)] 

map verwendet split jede Zeichenfolge in eine Liste zu spalten, ['foo', '1/', 'bar', '2']. Dann ordnen wir die vier Teile der Liste Variablen zu und manipulieren diejenigen, die wir interessieren, um ganze Zahlen zu erzeugen.

2

Es mit re.findall und eine schöne Liste Verständnis eine Chance ist: die Struktur der ursprünglichen Liste Änderungen

import re 

start = ['foo 1/ bar 2', 'foo 2/ bar 3', 'foo 34/ bar 45'] 

r = [tuple(int(j) for j in re.findall(r'\d+', i)) for i in start] 
print(r) 
# [(1, 2), (2, 3), (34, 45)] 

Im Fall re.findall noch alle ints fischen würden, als manuell Splitting und die Manipulation der Saiten gegen .

+2

Ich verstehe wirklich nicht, warum die Frage so stark abgelehnt wird. Und warum akzeptable Antworten abgelehnt werden ... die Frage ist klar und der Code, um das zu erreichen, ist ein netter Listcomp. Es ist nicht so, als würden wir 10000 Zeilen für das OP schreiben. –

2

gut ist es eine Zeile Antwort auf Ihre Frage:

finish = [(int(s.split(' ')[1][:-1]),int(s.split(' ')[3])) for s in start] 
1

Hier eine wiederverwendbare Reihe von Funktionen, die Sie gründlicher würde es ermöglichen, zu verstehen, was es ist, dass Sie tun, komplett mit Kommentaren. Perfekt für einen Anfänger, wenn das der Fall ist!

Achte darauf, dies ist eine sehr heruntergekommene und dreckige, unpythonische Version dessen, wonach du suchst, es ist nicht optimiert. Patrick Haugh und Moses Koledoye haben beide einfachere und geradlinigere, wenige Zeilen umfassende Antworten, die extrem pythisch sind! Dies wäre jedoch wiederverwendbar, indem andere Listen/Arrays als Parameter eingegeben werden.

Meine Absicht, dies hinzuzufügen, soll Ihnen helfen, zu verstehen, was Sie tun würden, indem Sie den Prozess "öffnen" und Schritt für Schritt gehen.

# Import the regular expressions 
import re 

# Your list 
start = ['foo 1/ bar 2', 'foo 2/ bar 3', 'foo 34/ bar 45'] 

def hasNumbers(stringToProcess): 

    """ Detects if the string has a number in it """ 

    return any(char.isdigit() for char in stringToProcess) 

def Convert2Tuple(arrayToProcess): 

    """ Converts the array into a tuple """ 

    # A list to be be returned 
    returnValue = [] 

    # Getting each value/iterating through each value 
    for eachValue in arrayToProcess: 

     # Determining if it has numbers in it 
     if hasNumbers(eachValue): 

      # Replace forward slash with a comma 
      if "/" in eachValue: 
       eachValue = eachValue.replace("/", ", ") 

      # Substitute all spaces, letters and underscores for nothing 
      modifiedValue = re.sub(r"([a-zA-Z_ ]*)", "", eachValue) 

      # Split where the comma is 
      newArray = modifiedValue.split(",") 

      # Turn it into a tuple 
      tupledInts = tuple(newArray) 

      # Append the tuple to the list 
      returnValue.append(tupledInts) 

    # Return it! 
    return returnValue 

# Print that baby back to see what you got 
print Convert2Tuple(start) 

Sie können effektiv die Funktion einer Variablen zuweisen:

finish = Convert2Tuple(start) 

So können Sie später die Rückgabewerte zugreifen.

Prost!