根据字符串中匹配的日期将两个列表压缩在一起

2024-09-24 22:21:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个从FTP文件夹中提取文件的列表:

sFiles = ftp.nlst(date+'sales.csv')
oFiles = ftp.nlst(date+'orders.csv')

结果显示两个列表如下所示:

^{pr2}$

用我的真实数据集,像。。。在

for sales, orders in zip(sorted(sFiles),sorted(oFiles)): 
     df = pd.concat(...)

获取所需的结果,但有时会出现问题,两个文件都无法放入正确的FTP文件夹中,因此我需要一些代码来创建一个iterable对象,以便根据日期提取匹配的订单和销售文件名。在

下面的工作。。。我不知道我会给它多少“Python”分数。可读性很差,但这是一种理解能力,所以我认为性能会有所提高?在

[(sales, orders) for sales in sFiles for orders in oFiles if re.search(r'\d+',sales).group(0) == re.search(r'\d+',orders).group(0)]

Tags: 文件csvin文件夹列表fordateftp
3条回答

你可以使用字典:

import collections
d = collections.defaultdict(dict)

sFiles = ftp.nlst(date+'sales.csv')
oFiles = ftp.nlst(date+'orders.csv')
for sale, order in zip(sFiles, oFiles):
    a, b = sale.split("_")
    a1, b2 = order.split("_")
    d[a]["sales"] = sale
    d[a1]["orders"] = order
print(dict(d))

现在,您的数据是按以下格式构造的:{"date":{"sales":"sales filename", "orders":"orders filename"}}

输出:

^{pr2}$

编辑:

通过字典理解和构建您建议的列表理解解决方案,您可以尝试以下操作:

import re
final_data = [{"sold":sold, "order":order} for sold in sFiles for order in oFiles if re.findall("\d+", sold)[0] == re.findall("\d+", order)[0]]

输出:

[{'sold': '20170822_sales.csv', 'order': '20170822_orders.csv'}, {'sold': '20170824_sales.csv', 'order': '20170824_orders.csv'}, {'sold': '20170825_sales.csv', 'order': '20170825_orders.csv'}, {'sold': '20170826_sales.csv', 'order': '20170826_orders.csv'}, {'sold': '20170827_sales.csv', 'order': '20170827_orders.csv'}]

仅仅因为理解的存在并不意味着你应该把它们用于所有事情。这很好:

date = re.compile(r'\d+')
for sales in sFiles:
    salesDate = date.search(sales).group(0)
    for orders in oFiles:
        orderDate = date.search(orders).group(0)
        if salesDate == orderDate:
            print sales, orders

有可能让它更快吗?对。但你不必因为你能做到而强迫它去理解列表。有时编写更多的代码会更好,因为它会将复杂性分散一点。在

下面是一个渐进的改进,使算法O(n):

^{pr2}$

利用熊猫数据帧的索引:

import pandas as pd
sFiles = ['20170822_sales.csv','20170824_sales.csv','20170825_sales.csv','20170826_sales.csv','20170827_sales.csv','20170828_sales.csv']
oFiles = ['20170822_orders.csv','20170823_orders.csv','20170824_orders.csv','20170825_orders.csv','20170826_orders.csv','20170827_orders.csv']

s_dates = [pd.Timestamp.strptime(file[:8], '%Y%m%d') for file in sFiles]
s_df = pd.DataFrame({'sFiles': sFiles}, index=s_dates)

o_dates = [pd.Timestamp.strptime(file[:8], '%Y%m%d') for file in oFiles]
o_df = pd.DataFrame({'oFiles': oFiles}, index=o_dates)

df = s_df.join(o_df, how='outer')

因此:

^{pr2}$

相关问题 更多 >