从少于4位的列表中提取数字,并在每个数字的开头和结尾添加一个字符串

时间:2018-12-05 19:31:10

标签: python python-3.x

我有一个包含多个数字的文件。

如果该数字少于4位数字,我们需要提取该数字,并将0附加到开头,再加上一个后缀,然后附加到主列表中。

ex

DF = [1,23,333,4444]

应该是

DF = [0001.hk,0023.hk,0333.hk,4444.hk]

下面的代码有效,并且可以帮助我完成上述任务。

Master_List = [Here is where all tickers should be store for some further processing]

def prework1():
    file = 'Path/to/document'
    tickers = []
    read = pd.read_csv(file, names =['IB_Symbol', 'Description', 'Symbol', 
    'Currency'])
    tickers = read['Symbol'].tolist()

    ticker_list = []

    for ticker in tickers:
        if len(ticker) == 1:
            ticker_list.append(ticker)

    ticker_list1 = []

    for ticker in ticker_list:
        string = '000'
        string1 = '.hk'
        tickers1 = [string + ticker + string1]
        ticker_list1.append(tickers1)

    ticker_list2 = []

    for sublist in ticker_list1:
        for item in sublist:
            ticker_list2.append(item)

    return ticker_list2



def prework2():
    file = 'Path/to/document'
    tickers = []
    read = pd.read_csv(file, names =['IB_Symbol', 'Description', 'Symbol', 'Currency'])
    tickers = read['Symbol'].tolist()

ticker_list = []

    for ticker in tickers:
        if len(ticker) == 2:
            ticker_list.append(ticker)

    ticker_list1 = []

    for ticker in ticker_list:
        string = '00'
        string1 = '.hk'
        tickers1 = [string + ticker + string1]
        ticker_list1.append(tickers1)

    ticker_list3 = []

    for sublist in ticker_list1:
        for item in sublist:
            ticker_list3.append(item)

    return ticker_list3


def prework3():
    file = 'Path/to/document'
    tickers = []
    read = pd.read_csv(file, names =['IB_Symbol', 'Description', 'Symbol', 
    'Currency'])
    tickers = read['Symbol'].tolist()

    ticker_list = []

    for ticker in tickers:
        if len(ticker) == 3:
            ticker_list.append(ticker)

    ticker_list1 = []

    for ticker in ticker_list:
        string = '0'
        string1 = '.hk'
        tickers1 = [string + ticker + string1]
        ticker_list1.append(tickers1)

    ticker_list4 = []

    for sublist in ticker_list1:
        for item in sublist:
            ticker_list4.append(item)

    return ticker_list4



test1 = prework1()
test2 = prework2()
test3 = prework3()

print(test1)
print(test2)
print(test3)

上述方法存在两个问题。

使用上面的代码,它将给我3个列表,但是结果应该只有1个列表,这样我可以做一些进一步的处理/任务。

此外,我觉得它看起来很奇怪且重复。它将达到预期的目的,但是有没有办法使它变得更好呢?

感谢所有帮助!

4 个答案:

答案 0 :(得分:3)

最简单的方法是:

>>> result = [f'{i:04}.hk' for i in DF]
>>> result
['0001.hk', '0023.hk', '0333.hk', '4444.hk']

在介绍格式字符串的PEP 498文档中详细了解。

答案 1 :(得分:2)

您可以在zfill中使用list comprehension

DF = [1, 23, 333, 4444]


def fill(lst, end='.hk'):
    return [s.zfill(4) + end for s in map(str, lst)]


print(fill(DF))

输出

['0001.hk', '0023.hk', '0333.hk', '4444.hk']

上面的列表理解与等效为:

def fill(lst, end='.hk'):
    result = []
    for s in map(str, lst):
        result.append(s.zfill(4) + end)
    return result

从文档zfill

  

返回剩下的用ASCII'0'数字填充的字符串的副本   一串长度为宽度的字符串。

因此,当代码正在调用s.zfill(4)时,它将在字符串的开头附加'0',直到字符串的长度为4。

答案 2 :(得分:0)

Python有一个zfill()函数,该函数将在字符串的开头添加零,直到该字符串具有所需的长度(如果位数较少):

>>> '23'.zfill(4)
'0023'
>>> '1234'.zfill(4)
'1234'

所以您可以这样做:

>>> DF = [ 1, 23, 333, 4444]
>>> D = [ str(i).zfill(4) + '.hk' for i in DF ]
>>> D
['0001.hk', '0023.hk', '0333.hk', '4444.hk']

答案 3 :(得分:0)

很酷的一个衬里可能是:

list(map(lambda x: ('000' + str(x) + '.hk')[-7:], ls))

这是在每个数字的开头添加一个'000',并在其结尾添加一个后缀。然后,它仅剪切第一部分(由于扩展名始终相同,因此您知道字符串具有的字符数始终为7)。这将是:

333 ==> 00033.hk ==> 0033.hk

如果您不熟悉map函数,它的作用是将一个函数应用于可迭代对象中的每个元素,因此会将此函数应用于此列表中的每个数字。

这是您尝试的一个迷你示例:

ls = [1, 23, 333, 4444]
print(list(map(lambda x: ('000' + str(x) + '.hk')[-7:], ls)))