小编Nic*_*ick的帖子

列表推导分裂循环变量

首先请原谅我有点差的头衔.我不太确定如何说出来.如果有人可以建议一个更好的标题.

我试图找出是否有一种方法只将列表推导的每次迭代的值拆分一次,但在输出中使用它两次.我试图解决的问题的一个例子是:

我有字符串

a = "1;2;4\n3;4;5"
Run Code Online (Sandbox Code Playgroud)

我想执行此操作:

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
Run Code Online (Sandbox Code Playgroud)

无需分三次运行拆分.所以这样的事情(这显然是无效的语法,但希望足以传达消息):

[(x[1],x[2]) for x.split(";") in a.split("\n") if x[1] != 5]
Run Code Online (Sandbox Code Playgroud)

在这个问题中,我不是在寻找获得字符串第2和第3列的奇特方法.这只是提供具体例子的一种方式.我当然可以使用示例:

[x.split(";")[1:3] for x in a.split("\n")]
Run Code Online (Sandbox Code Playgroud)

我想到的可能的解决方案:

  1. 不使用列表理解
  2. 保持原样
  3. 使用csv.DictReader,命名我的列和类似的东西StringIO给它输入.

这大部分都是一个很好的模式,能够使用而不是一个特定的案例,所以很难回答"你为什么要这样做"或"这是什么"的问题

更新:在阅读下面的解决方案后,我去了一些速度测试.我在我的基本测试中发现,所提供的解决方案比上面的天真解决方案快35%.

python split list-comprehension

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

XMonad:按下生成键时具有焦点的SpawnOn工作空间

我想让我的程序在屏幕上产生焦点,当它的键绑定被按下而不是在完成加载时当前焦点的屏幕上.

原因: 我目前的设置是Arch Linux + XMonad,我让它在6台显示器上运行.我已经使用XMonad大约一年了,我唯一的问题是需要一段时间才能打开的程序.例如,我第一次开始使用铬时需要3到几秒钟才能加载.我按下我的键绑定chrome,然后转到另一个屏幕做其他事情.但是当镀铬加载时,它会加载到屏幕上,而当前聚焦在屏幕上,而不是在按下生成键绑定时聚焦的屏幕上.

我的哈克尔技能很好......不存在.我以前在Lisp中编程并在C,python和JavaScript上花了很多时间,所以我确定如果需要的话我可以把它拿起来(所以请在答案中明确说明haskell样本).

提前致谢.

linux haskell xmonad

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

主要回来时,Haproxy会关闭与备份主机的连接

当主要主机在关闭后可用时,是否可以通过haproxy关闭与备份主机的所有连接?

上下文

我正在使用HAproxy为pubsub进行故障转移.

haproxy后端配置看起来像这样:

listen pubsub 0.0.0.0:1234
    mode tcp

    server primary primary.x.com:1234 weight 1 inter 500 rise 10 fall 5 check
    server backup backup.x.com:1234 weight 1 inter 500 rise 10 fall 5 check backup
Run Code Online (Sandbox Code Playgroud)

我为发布和订阅方都建立了长期的连接.

问题出现在以下情况中:

  • primary 下跌降落
  • A连接backup和发布
  • B连接backup和订阅
  • primary 固定,再次活着
  • C连接primary并发布但未B收到它
  • D连接primary和订阅但不获取A消息

我能看到的这个问题的最佳解决方案是当主服务器再次可用时,让haproxy强制关闭与备份主机的所有连接.

failover tcp load-balancing haproxy publish-subscribe

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

等待 Rust 中的期货列表

我试图创造一个不断寻找新工作要做的未来,然后为这些工作项目维护一组未来。我想确保我的主要未来不会长时间被阻止工作,也不会同时完成我的工作。

这是我正在尝试做的事情的粗略概述。具体isDone不存在,而且从我从文档中可以理解的内容来看,不一定是在 Rust 中使用期货的有效方法。做这种事情的惯用方法是什么?

use std::collections::HashMap;
use tokio::runtime::Runtime;

async fn find_work() -> HashMap<i64, String> {
    // Go read from the DB or something...
    let mut work = HashMap::new();
    work.insert(1, "test".to_string());
    work.insert(2, "test".to_string());
    return work;
}

async fn do_work(id: i64, value: String) -> () {
    // Result<(), Error> {
    println!("{}: {}", id, value);
}

async fn async_main() -> () {
    let mut pending_work = HashMap::new();
    loop {
        for (id, value) in find_work().await {
            if !pending_work.contains_key(&id) {
                let fut = …
Run Code Online (Sandbox Code Playgroud)

future rust

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

允许光标越过文件末尾,就像 VisualEdit=all 对于行尾所做的那样

我正在寻找一种方法,让我的光标移过文件末尾(无需添加大量需要稍后删除的空白行),这样当我编写一个长文件时,我就不会总是盯着看我显示器的最底部边缘。

完美的是我得到的相同行为,visualedit=all除了文件结束后的换行符而不是行结束后的空格。

vim

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

打印Rust中的所有struct字段

我有大约10个结构,每个结构之间有5-10个字段,我希望能够使用相同的格式将它们打印出来。

我的大多数结构如下所示:

struct Example {
  a: Option<String>,
  b: Option<i64>,
  c: Option<String>,
  ... etc
}
Run Code Online (Sandbox Code Playgroud)

我希望能够定义一个implfor,fmt::Display而不必再次枚举字段,因此,如果添加了新字段,就不会丢失一个字段。

对于结构:

let eg = Example{
  a: Some("test".to_string),
  b: Some(123),
  c: None,
}
Run Code Online (Sandbox Code Playgroud)

我想要输出格式:

a: test
b: 123
c: -
Run Code Online (Sandbox Code Playgroud)

我目前正在使用,#[derive(Debug)]但我不喜欢它打印出来Some(X)以及None其他一些东西。

如果我知道结构中的所有值都是Option<T: fmt::Display>我可以生成自己的Display方法而不必再次列出字段?

rust

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