【问题标题】:Select the last part of a string in a list [duplicate]选择列表中字符串的最后一部分[重复]
【发布时间】:2021-05-27 14:05:32
【问题描述】:

当我打印一个列表时,我有一个带有以下输出的列表:

['/dbfs/mnt/abc/date=20210225/fsp_store_abcxyz_lmn_', '/dbfs/mnt/abc/date=20210225/fsp_store_schu_lev_bsd_s_']

我们的要求是:

fsp_store_abcxyz_lmn_
fsp_store_schu_lev_bsd_s_

请您帮忙看看如何满足列表中的要求。

【问题讨论】:

  • [i.split('/')[-1] for i in lst]?
  • @MykolaZotko 是的,它确实回答了我的问题,非常感谢,您能否帮助我,例如是否也可以拥有源代码以及他的输出,例如 Source Extract /dbfs/mnt/abc/date =20210225/fsp_store_abcxyz_lmn_fsp_store_schu_lev_bsd_s_提取fsp_store_abcxyz_lmn_fsp_store_schu_lev_bsd_s_
  • @MykolaZotko 我们能否以表格格式获取两个不同列中的源和提取输出
  • @batman_special 更新了my answer 以表格形式输出。
  • @MykolaZotko 你能建议像这样的要求需要做什么

标签: python


【解决方案1】:

使用str.rpartition() 解决任务的示例。我不得不重新实现 Max() 和 LJust() 函数,因为你有 pyspark 并且它对内置函数 max()str.ljust() 有不同的实现。

运行我的代码后,您可以在代码中进一步使用res2res3res2 包含格式为 [source, extracted] 的所有行,res3 包含刚刚提取的值。

Try it online!

def Max(l):
    m = None
    for e in l:
        if m is None or e > m:
            m = e
    return m

def LJust(s, n):
    return s if len(s) >= n else s + ' ' * (n - len(s))

l = [
    '/dbfs/mnt/abc/date=20210225/fsp_store_abcxyz_lmn_',
    '/dbfs/mnt/abc/date=20210225/fsp_store_schu_lev_bsd_s_',
]
res = [e.rpartition('/')[-1] for e in l]
res2 = [[e0, e1] for e0, e1 in zip(l, res)]
maxl = Max([len(e) for e in l])
print('Source'.ljust(maxl) + '    Extracted')
print('\n'.join([LJust(s, maxl) + '    ' + d for s, d in res2]))
res3 = [e1 for e0, e1 in res2]

输出:

Source                                                   Extracted
/dbfs/mnt/abc/date=20210225/fsp_store_abcxyz_lmn_        fsp_store_abcxyz_lmn_
/dbfs/mnt/abc/date=20210225/fsp_store_schu_lev_bsd_s_    fsp_store_schu_lev_bsd_s_

【讨论】:

  • 我们能否也获取我们正在传递相应提取输出的源
  • @batman_special 不明白你的意思。你想让我用我的代码制作 util 函数吗?
  • 我的意思是在输出中我们也得到了源代码
  • @batman_special 我修改了答案以显示源和提取版本。是你想要的吗?
  • 是的@Arty 是这样的工作,它可以保持在表格格式...如源列和提取列
【解决方案2】:

假设您的列表项是路径:

import os

paths = [
  '/dbfs/mnt/abc/date=20210225/fsp_store_abcxyz_lmn_', 
  '/dbfs/mnt/abc/date=20210225/fsp_store_schu_lev_bsd_s_'
]

for path in paths:
    print(os.path.basename(path))

出来

fsp_store_abcxyz_lmn_
fsp_store_schu_lev_bsd_s_

os.path.basename:https://docs.python.org/3/library/os.path.html#os.path.basename

这个功能非常好,因为你不必指定路径分隔符。 [\\/]

【讨论】:

  • 最好使用pathlibprint(Path(path).name)
  • 这个问题没有像best answer 这样的概念。每个人都会使用他们更多的accommodated。有些人会使用str.split,有些会使用'os.path',有些会使用pathlib,这取决于视角和选择。
  • 请允许我不同意。这不仅仅是品味问题。使用字符串方法处理路径根本不理想,并且可能会导致问题。在其核心中,os.path 将路径视为简单字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2020-11-12
相关资源
最近更新 更多