我有一个包含多个数字的文件。
如果该数字少于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个列表,这样我可以做一些进一步的处理/任务。
此外,我觉得它看起来很奇怪且重复。它将达到预期的目的,但是有没有办法使它变得更好呢?
感谢所有帮助!
答案 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)))