Конкатенация Python - PullRequest
       9

Конкатенация Python

0 голосов
/ 12 июля 2011

Эта проблема, вероятно, очень проста, но я не могу понять -

У меня есть следующие значения: ['2000']['09']['22']

Я хочу следующее: 20000922 или '20000922'

код

def transdatename(d):
    year = re.findall('\d\d\d\d', str(d))
    premonth = re.findall('[A-Z][a-z]{2,9}', str(d))
    month = replace_all(str(premonth), reps)
    daypre = re.findall('\d{1,2},', str(d))
    day = re.sub(',','', str(daypre))
    fulldate = str(year)+str(month)+str(day)
    return fulldate

Пример данных

Ввод: ['\ nСентября 23, 2000']

Ожидаемый результат: '20000922'

Ответы [ 5 ]

4 голосов
/ 12 июля 2011

Вы пытаетесь это сделать?

>>> input= '\nSeptember 23, 2000'
>>> format= '\n%B %d, %Y'
>>> datetime.datetime.strptime(input,format)
datetime.datetime(2000, 9, 23, 0, 0)
>>> (_+datetime.timedelta(-1)).strftime("%Y%m%d")
'20000922'

Если это так, вы делаете это слишком сложно.

2 голосов
/ 12 июля 2011

Я предполагаю, что это элементы списка? Как это;

a=['2000']
b=['99']
c=['22']

Если все верно, то

a[0]+b[0]+c[0]

сделает свое дело

2 голосов
/ 12 июля 2011

Использование itertools.chain :

from itertools import chain    
data = [['2000'],['09'],['22']]   
''.join(chain(*data))
#OR
int(''.join(chain(*data))) # for numeric value representation

ИЛИ functools.reduce :

data = [['2000'],['09'],['22']]   
''.join(reduce(lambda res,x: res+x, data))

И

''.join(''.join(x) for x in data)

По крайней мере, если вы упомянули список, кортеж, набор списков:

initList = [['2000'],['09'],['22']]   
resultList = []
for subList in initList:
   resultList.append(''.join(subList))

outputValue = ''.join(resultList)
intValue = int(outputValue)

После прочтения вашего кода я думаю, что это можно сделать следующим образом:

str_dates = ['\nSeptember 23, 2000']
monthMap = {'January': 1, 'February': 2, ....}
month, day, year str_dates[0].lstrip('\n').split()
year + monthMap[month] + day[:-1]

ИЛИ - думаю, что это лучший способ:

from datetime import datetime
str_dates = ['\nSeptember 23, 2000']
[datetime.strptime(sDate,'%B %d, %Y').strftime('%Y%d%m') for sDate in str_dates]

Конечно, вы можете использовать регулярные выражения - но я не уверен, что это наиболее подходящий способ, однако, если вы хотите использовать его, было бы лучше использовать одиночный - что-то вроде этого (это просто пример кода должно быть лучшим выражением регулярного выражения):

yearData = re.findall(r'(?i)^([a-z]{2,9})\s(\d{1,2}),\s(\d{2,4}$)', 'September 23, 2000')
#yearData contains now [('September', '23', '2000')]
0 голосов
/ 12 июля 2011

Вот несколько подходов к изменению '\nSeptember 23, 2000' на '20000923':

Использование strptime:

import time
def transdatename(t):
    # won't work if day of month can be a single digit.  must have leading zero
    return time.strftime('%Y%m%d', time.strptime(t, '\n%B %d, %Y'))

print transdatename('\nSeptember 23, 2000') # prints 20000923

Использование регулярного выражения:

import re
# use dictionary to convert month name to two digit number
month_to_num = {'January': '01',
        'February': '02',
        'March': '03',
        'April': '04',
        'May': '05',
        'June': '06',
        'July': '07',
        'August': '08',
        'September': '09',
        'October': '10',
        'November': '11',
        'December': '12'}

def transdatename(t):
    month, day, year = re.search('(\w+)\W+(\d+)\W+(\d+)', t).groups()
    month = month_to_num[month]
    # if day could be a single digit use day.zfill(2)
    return year + month + day

print transdatename('\nSeptember 23, 2000') # prints 20000923
0 голосов
/ 12 июля 2011
['2000'][0] + ['09'][0] + ['22'][0] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...