【问题标题】:Python ConcatenationPython 连接
【发布时间】:2011-07-12 14:13:38
【问题描述】:

这个问题可能很简单,但我想不通 -

我有以下值:['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

示例数据

输入: ['\n2000 年 9 月 23 日']

预期输出: '20000922'

【问题讨论】:

  • ['2000']['09']['22'] - 它是什么?一个字符串?一份清单?
  • @user831880 我们很难提供帮助,因为我们不确定您所说的 ['2000']['09']['22'] 是什么意思。您能否编辑您的问题以包含来自 Python 解释器或 .py 文件的一些尝试的代码?
  • 我不确定它是什么!我正在尝试连接 3 个值,我认为这应该会导致一个长字符串,但它不起作用。我已将代码添加到原始帖子中。
  • 请给我们输入和预期输出
  • 我在上面添加了示例输入和输出。谢谢!!

标签: python concatenation


【解决方案1】:

你想这样做吗?

>>> 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】:

我假设这些是列表项? 像这样;

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

如果是这样的话,那么

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

会成功的

【讨论】:

  • 我试过这个,但它不会工作,我很害怕。我收到一个错误 - “异常:IndexError:列表索引超出范围”
  • 如果你输入我的代码,它可以工作:) - 但是,如果假设是错误的,也许你应该在以后的问题中更详细
【解决方案3】:

使用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')]

【讨论】:

  • @Kirk - 谢谢 - 但仍然有一些反对者没有评论原因。
  • -1。你假设你知道他所说的 ['2000']['09']['22'] 是什么意思。此外,从问题来看,这些答案对于提问者来说太复杂了,甚至无法理解。
  • 在这里使用 itertools 或 reduce 是非常不必要的 -1,因为您的最后一个解决方案似乎很明确 +1,所以没有投票。
  • @Steven, @utdemir:我不同意@Artsiom 的回答并不完全地道,但它们是对一个不清楚的问题的“有趣”解决方案。我想我曾经使用threadingsocket 帮助某人重命名文件,只是为了看看它会变得多么复杂。
  • @Steven 请记住,与原始发帖者相比,一个问题可能对更多人有用。问题的多种解决方案可能会增加价值。
【解决方案4】:
['2000'][0] + ['09'][0] + ['22'][0] 

【讨论】:

  • 投反对票者,试一试。它起作用并产生预期的结果。如果您能对它的工作方式提出具体的批评,我期待您的 cmets。
  • -1。你假设你知道他所说的['2000']['09']['22'] 是什么意思
  • @Steven:这很粗略,来吧,他的假设对我来说听起来很合理;来自我的 +1。
  • 我没有投反对票,但我也没有投赞成票。是的,这会产生正确的输出,但我怀疑这个单行答案可能对 user831880 帮助不大。
  • @Jon-Eric:你是对的。基于问题的有限范围,这是一个非常具体的答案。我可以按照@samb8s 在他的回答中所做的方式扩展它,将值分配给变量并对其进行操作,但这将基于假设。这个答案对于给定的范围是正确的。 OP 可以根据需要询问变量分配和相关问题。
【解决方案5】:

这里有几种将'\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

【讨论】:

  • 非常感谢!我最终使用 datetime 模块而不是正则表达式进行转换。
猜你喜欢
  • 2018-05-23
  • 2017-08-05
  • 2011-10-11
  • 2020-05-30
  • 2011-05-30
  • 2011-01-09
  • 2019-03-11
  • 2012-11-06
  • 2017-11-22
相关资源
最近更新 更多