преобразование строк - PullRequest
       2

преобразование строк

1 голос
/ 31 октября 2010

У меня есть объект длинной строки, который был отформатирован следующим образом

myString = “[name = john, family = candy, age = 72],[ name = jeff, family = Thomson, age = 24]”

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

Names    = []
Families = []
Ages     = []

Я хочу прочитать эту строку символ за символом и взять данные и добавить их в соответствующие списки.Может кто-нибудь помочь мне в этом о том, как разделить строку на переменные?Мне нужно что-то вроде этого:

Names = [“john”, “jeff”, ...]
Families = [“candy”, “Thomson”, ...]
Ages = [72, 24, ...]

Ответы [ 4 ]

5 голосов
/ 31 октября 2010

Это легче всего сделать с помощью регулярных выражений.По сути, создайте регулярное выражение, которое извлекает имя, семью и возраст из строки и извлекает соответствующие данные из tuple s, возвращенных для построения ваших list s.

import re

if __name__=='__main__':
    myString = "[name = john adams, family = candy, age = 72],[ name = jeff, family = Thomson, age = 24]"
    answers=re.findall("\\[\\s*name = ([^,]+), family = (\\w+), age = (\\d+)\\]",myString)
    names=[x[0] for x in answers]
    families=[x[1] for x in answers]
    ages=map(int,(x[2] for x in answers))

    print "names: ",names
    print "families: ", families
    print "ages: ", ages 
3 голосов
/ 31 октября 2010
import re

Names    = []
Families = []
Ages     = []
myString = "[name = john, family = candy, age = 72],[ name = jeff, family = Thomson, age = 24"

myregex = re.compile("name = (?P<name>.*?), family = (?P<family>.*?), age = (?P<age>.*)")

for list_ in myString.split(']'):
    found = re.search(myregex, list_).groupdict()
    Names.append(found['name'])
    Families.append(found['family'])
    Ages.append(int(found['age']))
1 голос
/ 31 октября 2010

Вы должны проанализировать это для списка словарей, а не для трех разных списков, связанных только по порядку данных.Как и в data = [ {"name": "John", "family": "Candy", "age": 72 }, ...]

Одна возможность, если вы не можете изменить источник данных, - это выполнить наивный анализ с помощью строковых методов, таких как split:

myString = "[name = john, family = candy, age = 72],[ name = jeff, family = Thomson, age = 24]"

data = []
for block in myString.split("]"):
    if not block: break
    block = block.split("[")[1]
    entry_dict = {}
    for part in block.split(","):
        key, value = part.split("=")
        key = key.strip()
        value = value.strip()
        if key == "age": value = int(value)
        entry_dict[key] = value
    data.append (entry_dict)

Или, если вына python 2.7 (или 3.1) и если вам нужен более короткий код, вы можете использовать генератор dict (вы можете использовать генераторы и в других версиях, просто создавая список кортежей и добавляя вызов dict):

myString = "[name = john, family = candy, age = 72], [name = jeff, family = Thomson, age = 24]"

data = []
for block in myString.split("]"):
    if not block: break
    block = block.split("[")[1]
    entry_dict = {}
    data.append ({(part.split("=")[0].strip(), part.split("=")[1].strip())  for part in block.split(",")  })

(в этой версии не преобразовано "age"на цифры)

1 голос
/ 31 октября 2010

Разбейте задачу:

  1. Разберите строку в списки
  2. Загрузите списки в другие списки.

У вас будетпроблема, потому что объекты между запятыми не являются хорошими словарями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...