社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
私信  •  关注

Grismar

Grismar 最近创建的主题
Grismar 最近回复了
3 年前
回复了 Grismar 创建的主题 » Python Hangman打印“a _e”函数的问题

你已经有了一些你需要的零件 for -循环并检查某个字母是否正确 in 这个词。

下面是一个很好的方法:

word = "Banner"
known_letters = ["a", "e"]
to_print = ''.join(letter if letter in known_letters else '_' for letter in word)
print(to_print)

或者,如果您想在两者之间留出空间:

to_print = ' '.join(letter if letter in known_letters else '_' for letter in word)

这些工作之所以有效,是因为 str.join() 获取一些字符串的iterable并将它们与它所调用的字符串连接在一起,即。 '-'.join('a', 'b', 'c') 返回 'a-b-c' .

letter if letter in known_letters else '_' 评估为 letter 如果 in known_letters 它的评估结果是 '_' 否则

所以,对所有的字母都这样做 word ,获取所有可以连接在一起的字符(使用空字符串或空格)。

3 年前
回复了 Grismar 创建的主题 » 在python中逐行复制文件的更有效方法?

我想你更想要这样的东西:

# this number is arbitrary, of course
ids_per_file = 1000
# use with, so the file always closes when you're done, or something happens
with open('20220317_EuroG_MD_v3_XT_POL_FinalReport.txt', 'r') as f:
    # an easier way to loop over all the lines:
    n = 0
    ids = set()
    try:
        for line in f:
            try:
                ids.add(line.split(',')[1])
            except IndexError:
                # you don't want to break, you just want to ignore the line and continue
                continue
            # when the number ids reaches the limit (or at the start), start a new file
            if not n or len(ids) > ids_per_file:
                # close the previous one, unless it's the first
                if n > 0:
                    out_f.close()
                # on to the next
                n += 1
                out_f = open(f'out{n}.csv', 'w')
                # reset ids
                ids = {line.split(',')[1]}
            # write the line, if you get here, it's a record
            out_f.write(line)
    finally:
        # close the last file
        out_f.close()

编辑:实际上有一个bug,会将第一个新的标识符写入前一个文件,认为这样更好。

3 年前
回复了 Grismar 创建的主题 » python中检查循环是否未执行的最佳方法

你可以查一下 for 循环没有遇到错误 break 具有 else ,这似乎就是你想要的。

import numpy as np


def minimum_working_environment(r):
    trial = np.arange(0, 6)[::-1]
    for i in range(len(trial)):
        if r > trial[i]:
            return i
    return len(trial)


def alternative(r):
    trial = np.arange(0, 6)[::-1]
    for i in range(len(trial)):
        if r > trial[i]:
            break
    else:
        i = len(trial)
    return i


print(minimum_working_environment(3))
print(minimum_working_environment(-3))

print(alternative(3))
print(alternative(-3))

结果:

3
6
3
6

这是因为循环控制变量 i 仍将具有循环中在 打破 还有 其他的 只有在 打破 从不执行。

但是,如果您只想终止一个函数,那么应该使用 return 。如果您确实需要知道循环是否完全完成(即没有中断),或者循环是否提前终止,则我提供的示例非常有用。它适用于你的例子,我想这正是一个例子。

3 年前
回复了 Grismar 创建的主题 » 对抗python类型注释

这就解决了整个问题:

import requests
import urllib.parse

from typing import Union, cast

default_gutendex_baseurl = "https://gutendex.com/"


class Gutendex(requests.Session):
    def __init__(self, baseurl: str = None):
        super().__init__()
        self.baseurl = baseurl or default_gutendex_baseurl

    def search(self, keywords: str) -> dict[str, str]:
        res = self.get("/books", params={"search": keywords})
        res.raise_for_status()
        return res.json()

    def request(
        self, method: str, url: Union[str, bytes], *args, **kwargs
    ) -> requests.Response:
        if isinstance(url, str):
            if not url.startswith("http"):
                url = urllib.parse.urljoin(self.baseurl, url)

            return super().request(method, url, *args, **kwargs)
        else:
            raise TypeError('Gutendex does not support bytes type url arguments')

你不能不处理 bytes 如果你说你接受它。只要提出一个例外或者做一些更好的事情 字节 通过。甚至只是 pass 如果你喜欢危险的生活。

这段代码在中验证得很好 mypy .

有点令人失望的是,这样的事情并不能证明:

        if not url.startswith("http"):
            url = urllib.parse.urljoin(self.baseurl, url if isinstance(url, str) else url.decode())
        return super().request(method, url, *args, **kwargs)

即使没有办法 url.startswith 得到一个 字节 当它是一个 str 反之亦然,它仍然无法验证。 麦皮 无法通过运行时逻辑进行验证,因此您只能执行以下操作:

    def request(
        self, method: str, url: Union[str, bytes], *args, **kwargs
    ) -> requests.Response:
        if isinstance(url, str):
            if not url.startswith("http"):
                url = urllib.parse.urljoin(self.baseurl, url)

            return super().request(method, url, *args, **kwargs)
        else:
            if not url.startswith(b"http"):
                url = urllib.parse.urljoin(self.baseurl, url.decode())

            return super().request(method, url, *args, **kwargs)

这两者都支持,但以一种丑陋的方式重复了逻辑。

3 年前
回复了 Grismar 创建的主题 » 如何在Python3.10中对二维对象列表进行分组?

正如@enke在评论中指出的,使用 list(zip(*gifs)) 获取转置,但它将是一个元组列表。

如果您需要将这些组设置为列表,可以这样做:

orderedGifs = list(map(list, zip(*gifs)))

它之所以有效,是因为:

  • *gifs 打开原件 gifs 并将所有内容传递给 zip() (传播)
  • zip() 将传递的每个iterable的元组中的元素配对,在本例中是每个列表的第一个元素,然后是第二个元素,以此类推。
  • map(list, xs) xs 适用于 list() 返回一个可计算的结果

所以把整件事都包起来 列表() 根据需要,将转换为列表的元组放入列表中。

5 年前
回复了 Grismar 创建的主题 » 用python打印带条件的字符串[复制]

p == 'O' or 'Q'

结果是 (p == 'O') or 'Q' 因为非空字符串的布尔值总是 True ,表达式总是 真的 .

你想要:

p in ['O', 'Q']

你也可以 p == 'O' or p == 'Q' or p == etc. ,但这会变得非常重复。

prefixes = "JKLMNOPQ"
suffix = "ack"

for p in prefixes:
    if p in ['O', 'Q']:
        print(p + 'u' + suffix)
    else:
        print(p + suffix)
5 年前
回复了 Grismar 创建的主题 » python对象的自定义过滤函数

像这样的:

from collections import namedtuple

Pair = namedtuple('Pair', ['id', 'score'])

pairs = [Pair(*t) for t in [(1, 1), (1, 1), (3, 7), (9, 3), (9, 4)]]

best_pairs = {}
for p in pairs:
    if p.id not in best_pairs or p.score > best_pairs[p.id]:
        best_pairs[p.id] = p.score

pairs = [Pair(*t) for t in best_pairs.items()]

print(pairs)

namedtuple 只是作为你的 Object 以及转换回 pairs 因为只有在你不喜欢字典的情况下,才有一个成对的列表 best_pairs .

[Pair(id=1, score=1), Pair(id=3, score=7), Pair(id=9, score=4)]
6 年前
回复了 Grismar 创建的主题 » 在Python IDE PyCharm中Unittest失败

既然你是专门问PyCharm的事,你需要做的就是:

  • 从单元测试文件中删除最后一行: unittest.main()
  • 或者按照@Zykerd的建议把它变成

这:

if __name__ == '__main__':
    unittest.main()
  • 右键单击PyCharm中的测试并选择 Run Unittests in test_name_function

两种方法都有效(即不调用main,或在调用main name检查之后调用main)。

5 年前
回复了 Grismar 创建的主题 » 为什么在python中使用x=list[0:8]创建list是错误的?

这是错误的,因为它没有给你想要的结果。

如果你写这个:

x = list[0:8]

您正在告诉Python:调用现有变量 list ,选择第0个元素到第8个元素(即前8个元素,列表从0开始),并将结果赋给变量 x .

这个 [0:8] 部分被称为“slice”,它适用于可以通过索引访问的许多类型的变量。当你把切片应用到 列表 ,Python将其解释为可索引的,并尝试“切片”它-除非您真正定义了一个名为 列表 ,不建议使用此选项,因为它将 列表 是标准Python的类型。

你没有告诉Python:生成从0到7的数字,把它变成一个列表,并将结果赋给变量 ,也就是说:

x = list(range(0, 8))

请注意,这对大多数情况都足够了,但它不会给您一个列表,而是范围本身,因此,如果您确实需要一个列表,请不要这样做:

x = range(0, 8)
6 年前
回复了 Grismar 创建的主题 » 如何使用remove.bg在Python中删除照片的背景

有几件事:

  • 你的问题中包含了你的API密钥;虽然这有助于我尝试你的问题,但是你可能不应该这样做,而是告诉人们在哪里可以得到他们自己的API密钥。
  • 如果你安装了像Postman这样的客户端 https://www.getpostman.com/downloads/ ,您可以在Python之外尝试请求,这正是我所做的,请求可以工作,所以问题不在于服务或API密钥。
  • 我试过你的代码,它对我很有用,最近安装了 requests ,请尝试更新您端的库,它可能会解决此问题。我用过 certifi==2019.9.11 requests==2.22.0 .
  • 你的台词 open('child-no-bg.png', 'U:\Training\python\remove-bg-master') 是错误的,假设您要在该目录中写入文件,请尝试以下操作 open(r'U:\Training\python\remove-bg-master\child-no-bg.png', 'wb') (这不是您的问题,但绝对是一个问题;第二个参数指示打开输出文件的模式,在这种情况下用于写入字节)
  • 我不知道该服务的详细信息,但如果您发送一个.jpg,它似乎不太可能返回一个.png的数据-您可能还想尝试以.jpg的形式编写文件;否则,您需要添加代码来转换格式。

给定错误消息,Python似乎无法验证SSL证书-该服务是否有可以首先尝试的http端点?

如果没有,请尝试使用SSL库通过https加载其他页面(任何页面,真的)-这些页面成功了吗,或者您可能发现了一般问题是什么?

您的问题可能与此有关: SSL3_GET_SERVER_CERTIFICATE certificate verify failed on Python when requesting (only) *.google.com

6 年前
回复了 Grismar 创建的主题 » python中的board[x,y]`和board[x][y]`有区别吗?

它实际上在基本python中不起作用(如您的示例)。如果运行代码,python将引发异常:“typeerror:列表索引必须是整数或切片,而不是元组”。

这个 1, 1 传递给 board 被解释为一个元组,并且由于board应该用整数或切片索引,所以这不起作用。

但是,如果 如果是某种类似数组的数据结构,并且开发人员已经实现了对元组索引的支持,那么这是可行的。这方面的一个例子是 numpy .

6 年前
回复了 Grismar 创建的主题 » 向python bytearray添加非转义转义字符

您的问题是对刚接触Python的程序员非常常见的误解的结果。

在将字符串(或字节)打印到控制台时,python将转义字符( \ )显示一个字符串,当在python中作为文本使用时,它将给出完全相同的值。

所以:

s = 'abc\\abc'
print(s)

印刷品 abc\abc 但在口译员身上你可以得到:

>>> s = 'abc\\abc'
>>> print(s)
abc\abc
>>> s
'abc\\abc'

注意这是正确的。毕竟 print(s) s 在解释器上,请求python向您显示 代表 其中包括引号和转义字符。

比较:

>>> repr(s)
"'abc\\\\abc'"

repr 这里打印的是 S .

为了 bytes ,情况更复杂,因为在使用 print ,因为print打印一个字符串和一个 字节 需要先解码,即:

>>> print(some_bytes.decode('utf-8'))  # or whatever the encoding is

简而言之:您的代码正在做您想要它做的事情,它不重复转义字符,您认为它做了是因为您在查看字节的表示,而不是实际的字节内容。

顺便说一下,这也意味着您不必偏执,也不必费心编写自定义代码来替换基于其ASCII值的字符,您只需:

>>> example = bytes('<some attr="value">test</some>', encoding='utf-8')
>>> result = example.replace(b'"', b"\\\"")
>>> print(result.decode('utf-8'))
<some attr=\"value\">test</some>

我不会假装的 b"\\\"" 可能是直觉 b'\\"' 更好-但这两者都要求您理解字符串的表示形式或其打印值之间的差异。

因此,最后:

>>> example = b'<some attr="value">test</some>'
>>> result = example.replace(b'"', b'\\"')
>>> print(result.decode('utf-8'))
<some attr=\"value\">test</some>