首页 > 编程问答 >避免字符串连接的嵌套循环的 Pythonic 方法

避免字符串连接的嵌套循环的 Pythonic 方法

时间:2024-07-30 15:40:15浏览次数:7  
标签:python python-3.x

我想找到所有 5 位数字的字符串,其中

  • 前三位数字在我的第一个列表中,
  • 第二个槽第四个数字在我的第二个列表中,
  • 第三到第五个数字在我的最后一个列表中:
l0=["123","567","451"]
l1=["234","239","881"]
l2=["348","551","399"]

因此应该产生: ['12348', '12399']

因此我编写了一个函数 is_successor(a,b) 来测试 a 和 b 是否重叠:

def is_successor(a:str,b:str)->bool:
    """tests if strings a and b overlap"""
    return a[1:]==b[:2]

然后我可以通过编写这个嵌套循环/检查结构来实现我的目标,即基本上追加到前面的字符串并产生所有有效的字符串:

pres=[]
for c in l2:
    for b in l1:
        if is_successor(b,c):
            for a in l0:
                if is_successor(a,b):
                    pres.append(a[0]+b[0]+c)

pres
  • 我知道我可以将其编写为列表理解,但对于我的原始数据,我有更多嵌套列表,即使在列表理解中我也失去了可读性。
  • 我从 l2 -> l0 开始,因为在我的原始数据中,列表变得更长,索引越低,因此我可以通过这种方式尽早过滤掉更多案例。
  • 通过 l0,l1,l2 的所有组合的单个循环并检查所有项目的连续性 a,b,c 同时可以工作,但它测试的不必要的组合比我当前的构造更多。

问题

如何吸引这个嵌套循环和条件检查调用?有没有一种Python式的方法来捕获 for -> is_successor() 的重复?


以下是使用生成器表达式和一些 itertools 函数(如 itertools.product itertools.islice )在 Python 中实现此目的的一种更 Pythonic 的方法:

import itertools

def is_successor(a: str, b: str) -> bool:
    """测试字符串 a 和 b 是否重叠"""
    return a[1:] == b[:2]

def generate_strings(l0, l1, l2):
    """生成满足给定条件的所有 5 位数字字符串"""
    for a, b, c in itertools.product(l0, l1, l2):
        if is_successor(a, b) and is_successor(b, c):
            yield a[0] + b[0] + c

l0 = ["123", "567", "451"]
l1 = ["234", "239", "881"]
l2 = ["348", "551", "399"]

result = list(generate_strings(l0, l1, l2))
print(result)  # 输出:['12348', '12399']

下面是对代码的逐行解释:

  1. import itertools : 这会导入 Python 的 itertools 模块,该模块提供了用于处理迭代器的各种函数,这些函数可以使代码更有效率和简洁。
  2. def generate_strings(l0, l1, l2) : 此函数使用生成器表达式生成满足给定条件的所有 5 位数字字符串。
  3. for a, b, c in itertools.product(l0, l1, l2) : 此行使用 itertools.product() 函数从输入列表 l0 l1 l2 生成所有可能的组合。这避免了显式嵌套循环。
  4. if is_successor(a, b) and is_successor(b, c) : 此条件检查 a b c 的当前组合是否满足 is_successor 函数定义的重叠条件。
  5. yield a[0] + b[0] + c : 如果组合满足条件,则此行会使用 yield 关键字生成连接后的 5 位数字字符串。这会创建一个生成器函数,该函数在每次调用时生成一个字符串,从而使内存使用率保持较低,尤其是在处理大量数据时。

此代码避免使用显式嵌套循环,并且通过使用生成器表达式来创建字符串组合,从而使其更具 Python 风格,从而提高了可读性和效率。

标签:python,python-3.x
From: 78810300

相关文章

  • Python 环境配置(二)安装jupyter、matplotlib、numpy库
    Python环境配置(二)安装jupyter、matplotlib、numpy库一、numpypipinstallnumpy二、matplotlibpipinstallmatplotlib三、jupyter1、anaconda自带Jupyter2、pycharm插件只有Pycharm的Professional版才支持JupyterNotebook,请注意版本3、新建文件#%......
  • 如何使用 PIPE 并行运行 python 子进程?
    我正在使用inkscape将一堆SVG图像转换为PNG。单线程:importsubprocessimporttimeimportosinkscape_path=r'C:\ProgramFiles\Inkscape\bin\inkscape.com'steps=30filenames=[]processes=[]#t_start=time.process_time()t_start=time.time()f......
  • Python sqlite3 删除数据
    要从SQLite表中删除记录,你需要使用DELETEFROM语句。要删除特定的记录,你需要同时使用WHERE子句。要更新特定的记录,你需要同时使用WHERE子句。语法以下是SQLite中DELETE查询的语法- DELETEFROMtable_name[WHEREClause]PythonCopy例子假设我们使用以下查询创建了......
  • Python 环境配置(一)Python、Anaconda、Pycharm的安装
    Python环境配置(一)Python、Anaconda、Pycharm的安装本人之前已安装一次,此次为卸载之后的重新安装。。。一、Python1、下载下载官网:下载链接:DownloadPython|Python.org勾选添加到路径(环境变量)next如图所示之后点close关闭2、验证win+Rcmd:python退出ex......
  • Pycharm 设置 yaml 格式接口测试用例模板 (python+pytest+yaml)
    前言初次编写的伙伴们可能对yaml格式不太熟悉,自己写yaml用例的时候,总是格式对不齐啊记不住设定好的关键字啊等等等琐事是我们可以在pycharm上设置用例模块,通过快捷方式调用出对应的模块,达到高效写用例的目的。 pycharm操作集:1、File-Settings(快捷键Ctrl+Alt+S) 2、Live......
  • Python - Redirecting output of print to a file
    Theprintfunctioncanalsobeusedtowritetoafile.Theoutputofprint,thatisbydefault,senttothescreencanberedirectedtoanopenfile.Forthis,youhavetosupplythefileobjectasanargumentforthenamedparameterfile.Hereisanexa......
  • Python:添加到相对于当前运行脚本的 sys.path 的最佳方法
    我有一个充满脚本的目录(比如说project/bin)。我还有一个位于project/lib的库,并希望脚本自动加载它。这是我通常在每个脚本的顶部使用的:#!/usr/bin/pythonfromos.pathimportdirname,realpath,sep,pardirimportsyssys.path.append(dirname(realpath(_......
  • python身份证号码+姓名一致性核验、身份证号码真伪查询API集成
    身份证号码+姓名核验的方式,顾名思义是身份证二要素核验,一般情况下,身份证真伪查询需要上公安户籍系统查询,但此种方式仅适合个人查询,企业要想随时随地实现身份证实名认证的功能,便需要集成身份证实名认证接口功能。翔云人工智能开放平台提供身份证号实名认证接口,实时联网,上传身份证......
  • 如何将数字分配给返回的 python 数据列表,我可以调用这些数据来打印
    这里完全是菜鸟。我在网上搜索过,找不到我想要做的事情的答案。我的代码在这里:importbs4asbsimporturllib.requestsauce=urllib.request.urlopen('https://www.amazon.com/gp/rss/bestsellers/kitchen/289851/ref=zg_bs_289851_rsslink').read()soup=bs.Beautiful......
  • python API增值税发票四要素核验、数电票查验、医疗票查验
    长期以来,对发票进行高效的管理一直困扰着众多企业财务,手动录入效率慢、出错率高、纸质发票易丢失等。今天,翔云为广大企业提供了发票查验接口与财政票据查验接口服务,可针对增值税发票管理系统开具发票,医疗票据、非税收入等财政类票据进行真伪查验。翔云发票识别接口,使得企业财务无......