当前位置: 首页 > 知识库问答 >
问题:

Python代码行太长,需要拆分

公羊宇定
2023-03-14

如果可能的话,我如何用更少的代码将下面所示代码的结尾部分移到另一行或修改文本,以实现所需的结果。我键入了以下代码:

import pandas as pd
import requests
from bs4 import BeautifulSoup
res = requests.get("http://web.archive.org/web/20070826230746/http://www.bbmf.co.uk/july07.html")
soup = BeautifulSoup(res.content,'lxml')
table = soup.find_all('table')[0]

df = pd.read_html(str(table))
df = df[1]
df = df.rename(columns=df.iloc[0])
df = df.iloc[2:]
df.head(15)

Southport = df[df['Location'].str.contains('- Display') & (df['Lancaster'] == '') & (df['Dakota'] == 'D') & (df['Spitfire'] == 'S') & (df['Hurricane'] == 'H') | (df[df['Location'].str.contains('- Display') & (df['Lancaster'] == '') & (df['Dakota'] == 'D') & (df['Spitfire'] == 'S') | df[df['Location'].str.contains('- Display') & (df['Lancaster'] == '') & (df['Dakota'] == 'D') & (df['Spitfire'] == 'SS')] 
Southport

我试图实现的是显示以下数据:-仅显示,仅显示Dakota Spitfire和Hurricane或Dakota和Spitfire或Dakota和两个Spitfire,如果它们显示在数据表明细表中,则完整代码如下。需要编辑的是从Southport=开始的行:

当我运行代码时,我得到以下回溯错误,我认为这是由于代码行太长:

File "<ipython-input-1-518a9f1c8e98>", line 23
    Southport
            ^
SyntaxError: invalid syntax

我正在运行网络程序Jupyter笔记本里的代码

共有2个答案

司空皓
2023-03-14

你有一条长得离谱的线,可以从分裂中获益:

Southport = df[df['Location'].str.contains('- Display') & (df['Lancaster'] == '') & (df['Dakota'] == 'D') & (df['Spitfire'] == 'S') & (df['Hurricane'] == 'H') | (df[df['Location'].str.contains('- Display') & (df['Lancaster'] == '') & (df['Dakota'] == 'D') & (df['Spitfire'] == 'S') | df[df['Location'].str.contains('- Display') & (df['Lancaster'] == '') & (df['Dakota'] == 'D') & (df['Spitfire'] == 'SS')] 

让我们这样做,我们可能会看到错误:

Southport = df[
    df['Location'].str.contains('- Display') & 
    (df['Lancaster'] == '') & 
    (df['Dakota'] == 'D') & 
    (df['Spitfire'] == 'S') & 
    (df['Hurricane'] == 'H') | 
    (df[
        df['Location'].str.contains('- Display') & 
        (df['Lancaster'] == '') & 
        (df['Dakota'] == 'D') & 
        (df['Spitfire'] == 'S') | 
        df[
            df['Location'].str.contains('- Display') & 
            (df['Lancaster'] == '') & 
            (df['Dakota'] == 'D') & 
            (df['Spitfire'] == 'SS')] 

在我看来,括号和括号没有正确对齐——开括号(准确地说,两个开方括号和一个开方括号)比闭括号多。这与为什么您会收到一个SynTaxError是一致的。所以让我们试着解决这个问题:

Southport = df[
        (
            df['Location'].str.contains('- Display') & 
            df['Lancaster'] == '' & 
            df['Dakota'] == 'D' & 
            df['Spitfire'] == 'S' & 
            df['Hurricane'] == 'H'
        )
    ] | df[
        (
            df['Location'].str.contains('- Display') & 
            df['Lancaster'] == '' & 
            df['Dakota'] == 'D' & 
            df['Spitfire'] == 'S'
        )
    ] | df[
        (
            df['Location'].str.contains('- Display') & 
            df['Lancaster'] == '' & 
            df['Dakota'] == 'D' & 
            df['Spitfire'] == 'SS'
        )
    ] 

我想,这与你想写的东西更接近(尽管我不确定你最初到底想写什么)。请注意,将这样的代码分隔成单独的行,这样可以更容易地查看条件是如何对齐的,哪些比较嵌套在哪些其他比较中,等等。

一般的经验法则是,将行长度保持在某个阈值以下(例如,120个字符),您的特定IDE可能会也可能不会对您大喊大叫。有时,由于变量名冗长,所以会出现一个跨越整行的单数表达式,这很好。但总的来说,这种经验法则的存在是为了鼓励这种行为——以一种让阅读代码的人更清楚的方式来拆分行。

何德寿
2023-03-14

我认为这是典型的复制/粘贴错误;您只需删除第一个(第一个(df[)之后的df[(df['Hurricane']='H')|,以及第二个|之后的df[),那么至少不应该再有任何语法错误。

然而,逻辑过于冗长,因为df['Location']。str.contains('-Display')(df['Lancaster']='')以及(df['Dakota']='D')是每个布尔项或分隔布尔项的一部分。

除此之外,df['Location']。str.contains(“-Display”)

Southport = df[df['Location'].str.contains('- Display') & (df['Lancaster'] == '') & (df['Dakota'] == 'D') & (df['Spitfire'] == 'S') | df['Location'].str.contains('- Display') & (df['Lancaster'] == '') & (df['Dakota'] == 'D') & (df['Spitfire'] == 'SS')] 

它可以表示为

Southport = df[(df['Location'].str.contains('- Display') & (df['Lancaster'] == '') & (df['Dakota'] == 'D')) & ((df['Spitfire'] == 'S') | (df['Spitfire'] == 'SS'))] 

因为A

如果我没记错的话,像=='S'或=='SS'这样的模式应该用pandas'isin来更好地表达:

Southport = df[df['Location'].str.contains('- Display') & (df['Lancaster'] == '') & (df['Dakota'] == 'D') & df['Spitfire'].isin(['S', 'SS'])] 

 类似资料:
  • 我目前正在android手机上开发一款简单的mp3播放器作为应用程序。我正在查看sd卡和内部存储器上的所有文件,找到所有扩展名为“.mp3”的文件。 简单又好用。 然后我填写一个列表,列出所有产生的歌曲名称,点击后,它们开始播放。工作也很好,但是 我现在在我的个人手机上尝试了这一点,上面有700首歌曲,列表在不到一秒钟的时间内完成,但现在列表将用结果填充foreach循环中的ScrollView。

  • 问题内容: 错误代码:1406。数据对于列而言太长 现在一些值 插入记录超过 如果我们的 它显示错误信息 错误代码:1406。数据对于列而言太长 但是我的期望是,我想在表中至少插入前45个字符 如果问题不清楚,请告诉我。 我知道此错误的原因。我正在尝试插入比数据类型长度更多的值。 我想要MySQL中的解决方案,因为它可能在中。所以我希望它也会出现在 MySQL中 。 问题答案: MySQL将截断任

  • 这只是我的代码中的示例数据。我想规范化其他列中的合计列。目前我有大约2000个小组,正常化和fgroup需要15分钟。 减少时间的方法有哪些。 谢谢

  • 问题内容: 我有一个PHP加密功能。我需要一个Java计数器部分。由于我对PHP的了解有限,因此无法理解。有人会两种语言,请帮忙。 PHP代码: 在此先感谢Aniruddha 问题答案: 这应该做。 Java中的MCRYPT_RIJNDAEL_128和MCRYPT_MODE_CBC等效于AES / CBC / NoPadding。您还需要一个用于Base64编码的实用程序,以上代码在Apache

  • 可能的重复: Java是什么?:运算符叫什么,它做什么? 你好,我在理解下面的代码时遇到了一些问题,有人能帮我弄到吗? 我不明白是什么意思。

  • 下面是WebPack4配置代码: 新的配置代码从项目中使用的节点模块中获取所有代码。但我只希望拆分供应商库(我在enrtry配置部分定义),而不希望拆分node_modules中的所有代码。 在本例中:“babel-polyfill”,“react”,“react-dom”,“jquery”,“bootstrap”