小编Leo*_*ark的帖子

如何在列表理解中添加额外的中间步骤?

假设我有一个list[str]包含时间戳"HH:mm"格式的对象,例如

timestamps = ["22:58", "03:11", "12:21"]
Run Code Online (Sandbox Code Playgroud)

我想将其转换为list[int]每个时间戳的“自午夜以来的分钟数”值的对象:

converted = [22*60+58, 3*60+11, 12*60+21]
Run Code Online (Sandbox Code Playgroud)

...但我想以风格来完成它并使用单个列表理解来完成它。我天真的构建的(语法不正确的)实现类似于:

def timestamps_to_minutes(timestamps: list[str]) -> list[int]:
    return [int(hh) * 60 + int(mm) for ts in timestamps for hh, mm = ts.split(":")]
Run Code Online (Sandbox Code Playgroud)

...但这不起作用,因为这for hh, mm = ts.split(":")不是有效的语法。

写同样的东西的有效方式是什么?

澄清一下:我可以看到一个形式上令人满意的解决方案,其形式为:

def timestamps_to_minutes(timestamps: list[str]) -> list[int]:
    return [int(ts.split(":")[0]) * 60 + int(ts.split(":")[1]) for ts in timestamps]
Run Code Online (Sandbox Code Playgroud)

...但是这是非常低效的,我不想将字符串分割两次。

python list-comprehension

26
推荐指数
5
解决办法
1919
查看次数

在 dataclass(slots=True) 子类中调用 super() 时出现类型错误

我正在尝试使用slots=TruePython 3.10.5 中的数据类调用超类方法。

from dataclasses import dataclass


@dataclass(slots=True)
class Base:
    def hi(self):
        print("Hi")


@dataclass(slots=True)
class Sub(Base):
    def hi(self):
        super().hi()


Sub().hi()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误。

Traceback (most recent call last):
  File "...", line 16, in <module>
    Sub().hi()
  File "...", line 13, in hi
    super().hi()
TypeError: super(type, obj): obj must be an instance or subtype of type
Run Code Online (Sandbox Code Playgroud)

slots=True如果我从 中删除Sub,或者手动将其设为非数据类,则效果很好__slots__。如果我改为执行这些操作,错误仍然存​​在Base

Sub.__mro__(<class '__main__.Sub'>, <class '__main__.Base'>, <class 'object'>)isinstance(Sub(), Base)True

python inheritance slots python-dataclasses

12
推荐指数
1
解决办法
755
查看次数

为什么“map”隐藏“StopIteration”?

map()我发现了一种使用不等同于列表理解的情况。next当用作第一个参数时会发生这种情况。

例如:

l1 = [1, 2]
l2 = ['hello', 'world']
iterators = [iter(l1), iter(l2)]

# list comprehension
values1 = [next(it) for it in iterators]
# values1 = [1, "hello"]
values2 = [next(it) for it in iterators]
# values2 = [2, "world"]
values3 = [next(it) for it in iterators]
# raise StopIteration
Run Code Online (Sandbox Code Playgroud)
l1 = [1, 2]
l2 = ['hello', 'world']
iterators = [iter(l1), iter(l2)]

# map
values1 = list(map(next, iterators))
# values1 = [1, "hello"]
values2 = list(map(next, …
Run Code Online (Sandbox Code Playgroud)

python python-3.x

7
推荐指数
1
解决办法
182
查看次数

HDR,自适应色调映射和GLSL中的MSAA

为了自学OpenGL,我正在通过第五版的Superbible工作.

我目前正在试图弄清楚如何结合HDR和MSAA(如第9章所述).

对于HDR,本书提出了一种自适应色调映射方法,该方法基于计算每个片段的5x5卷积滤波器的平均亮度.

对于MSAA,使用的方法通过从样本距离计算的权重来平均所有样本.

我尝试将两者结合起来,在下面的pastebin中,将色调映射应用于每个样本,然后平均它们以计算最终的片段颜色.

性能是(正如人们应该预期的那样?)可怕:每个样本25个查找,4xMSAA为4次,我猜测GPU花费大部分时间来查找我的FBO纹理.切换到代码中由use_HDR统一控制的代码路径,对于简单的场景,性能会下降400 + fps到10以下.

我的问题是双重的:

  • 这是一种执行色调映射的理智方法吗?如果没有,你会建议什么?

  • MSAA和基于卷积的过滤器应该如何组合?我猜我会再次遇到这个问题需要查找相邻纹素的任何滤镜,即几乎任何像绽放,模糊等等?

码:

#version 330
in Data
{
    vec4 position;
    vec4 normal;
    vec4 color;
    vec2 texCoord;
    mat4 mvp;
    mat4 mv;
} gdata;

out vec4 outputColor;
uniform sampler2DMS tex;
uniform sampler1D lum_to_exposure;
uniform samplerBuffer weights;
uniform int samplecount;
uniform bool use_HDR;

vec4 tone_map(vec4 color, float exp)
{
    return 1.0f - exp2(-color * exp);
}

const ivec2 tc_offset[25] = ivec2[](ivec2(-2, -2), ivec2(-1, -2), ivec2(0, -2), ivec2(1, -2), ivec2(2, -2),
                                    ivec2(-2, -1), …
Run Code Online (Sandbox Code Playgroud)

opengl glsl

6
推荐指数
1
解决办法
8960
查看次数

if a == b or a == c: vs if a in {b, c}:

在我的代码中,我曾经if a == b or a == c or a == d:经常进行比较。在某些时候,我发现这些可以很容易地缩短为if a in {b, c, d}:或者if a in (b, c, d):如果值不可哈希。但是,我从未在其他任何人的代码中看到过这样的结构。这可能是因为:

  1. ==方法比较慢。
  2. ==方法是更Python。
  3. 他们实际上做了微妙不同的事情。
  4. 我碰巧也没有看过任何需要的代码。
  5. 我见过它,只是忽略或忘记了它。
  6. 人们不应该需要进行这样的比较,因为其他地方的代码应该会更好。
  7. in除了我,没有人想过办法。

如果有,是哪个原因?

python

5
推荐指数
1
解决办法
3979
查看次数

为什么传递向量可以,但传递切片却不行?

当我写下这个:

fn add1(vc: &mut Vec<usize>) {
    func1(vc, vc[0]);
}
fn func1(vc: &mut Vec<usize>, val: usize) {}
Run Code Online (Sandbox Code Playgroud)

Clippy 告诉我“写入&mut Vec而不是&mut [_]涉及一个切片可以做的新对象”。

但是,如果我将其切换为:

fn add1(vc: &mut Vec<usize>) {
    func1(vc, vc[0]);
}
fn func1(vc: &mut [usize], val: usize) {}
Run Code Online (Sandbox Code Playgroud)

我得到“不能*vc作为不可变借用,因为它也作为可变借用 [E0502]”。

这是有道理的,但是为什么之前它会起作用呢?

另外,为什么 Clippy 给我错误的警告?

链接到工作示例

链接到不起作用的示例

slice rust borrow-checker

5
推荐指数
0
解决办法
198
查看次数

无法从 graphlib 获取 TopologicalSorter

我做到了

pip3 install graphlib
Run Code Online (Sandbox Code Playgroud)

我现在可以了import graphlib,但是

from graphlib import TopologicalSorter
Run Code Online (Sandbox Code Playgroud)

失败了。如果是的话import graphlib,它告诉我没有属性TopologicalSorter

我究竟做错了什么?

python importerror

2
推荐指数
1
解决办法
970
查看次数

将“0b”添加到字节

我有一个程序,例如,我需要将包含字符串的变量转换为,'01000100'以便0b01000100我可以将其解码为相应的符号,在本例中,'D'是使用内置chr()函数的字母。如何进行这种转换,或者是否有更简单的方法将字符串转换为相应的符号?

python binary

1
推荐指数
1
解决办法
75
查看次数

sizeof 接受什么类型的参数?

我有以下代码:

void main(int argc, char *argv[]){
    for (int i=1; i<argc; i++){
        printf("%s-%lu\t", argv[i], sizeof(argv[i]));
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这$./a.out int long应该给我

short-2 int-4 long-8 
Run Code Online (Sandbox Code Playgroud)

但我得到了

short-8 int-8 long-8
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么吗?

c

0
推荐指数
1
解决办法
127
查看次数

为什么 import * 在 Python 3 中不是有效语法?

我最近尝试了这段代码,只是为了满足好奇心。

from * import * as *

if __name__ == '__main__':
    z = *.zeros((3,3))
    print(z)
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我为什么import *不被认为是有效的选择吗?我真的希望有一个选项可以仅导入一行中安装/识别的每个库。我应该发布错误报告还是功能请求?

python python-import

-1
推荐指数
1
解决办法
182
查看次数