2017-01-24 3 views
0

Как преобразовать следующий список:Преобразование из кортежей строк для кортежей в Python

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

следующий список кортежей:

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

Я начал попытку с этим:

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

но все еще не полный и его получение уродливые.

ответ

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 использует split разделить каждую строку в список, ['foo', '1/', 'bar', '2']. Затем мы назначаем четыре части списка переменным и манипулируем теми, которые нам нужны для создания целых чисел.

2

Там есть шанс с re.findall и хороший список понимание:

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)] 

В случае структура начальных изменений списка, re.findall бы еще выловить все Интс, а не вручную расщепления и манипулирования строками ,

+2

Я действительно не понимаю, почему вопрос настолько занижен. И почему приемлемые ответы ниспроверены ... вопрос ясен, а код для этого - хороший список. Это не то, что мы пишем 10000 строк для OP. –

2

хорошо есть одна линия ответ на ваш вопрос:

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

Вот многоразовый набор функций, которые позволят вам более полно понять, что это такое, что вы делаете, в комплекте с комментариями. Идеально подходит для новичка, если это так!

Помните, что это очень пустая и грязная версия, которую вы, возможно, ищете, она неоптимизирована. Патрик Хоу и Моисей Коледое имеют более простые и прямые ответы на несколько строк, которые чрезвычайно pythonic! Однако это можно было бы повторно использовать, введя другие списки/массивы в качестве параметров.

Мое намерение добавить это, чтобы помочь вам понять, что именно вы делаете, «открывая» процесс и шаг за шагом.

# 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) 

Вы можете эффективно присвоить функцию переменной:

finish = Convert2Tuple(start) 

Таким образом, вы можете получить доступ к значениям, возвращаемым позже.

Cheers!

Смежные вопросы