私信  •  关注

Grismar

Grismar 最近创建的主题
Grismar 最近回复了
4 年前
回复了 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 ,获取所有可以连接在一起的字符(使用空字符串或空格)。

4 年前
回复了 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,会将第一个新的标识符写入前一个文件,认为这样更好。

4 年前
回复了 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 。如果您确实需要知道循环是否完全完成(即没有中断),或者循环是否提前终止,则我提供的示例非常有用。它适用于你的例子,我想这正是一个例子。

4 年前
回复了 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)

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

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

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

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

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

它之所以有效,是因为:

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

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

6 年前
回复了 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)
6 年前
回复了 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)]
7 年前
回复了 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)。

6 年前
回复了 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>