【问题标题】:How to reverse the order of sets of characters in a string using flip?如何使用翻转反转字符串中字符集的顺序?
【发布时间】:2022-11-08 18:29:35
【问题描述】:

我想反转列表中每个元素的货币顺序,即 CADUSD 需要变为 USDCAD。

ccys:("CADUSD";"NZDUSD"; "USDAUD")
"" sv/:flip(-3,3)#'\:ccys 

以上就是这样做的。我读过翻转 x 返回 x 转置并且 # 是取运算符;但我无法清楚地理解 ' 和 flip(-3,3)# 是如何实现这一点的。

你能帮我理解这个吗? 或者,有没有更简单的方法来做同样的事情?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    如果您知道所有货币都是 3 字符,rotate 关键字也可以实现此目的:

    q)3 rotate/:ccys
    "USDCAD"
    "USDNZD"
    "AUDUSD"
    

    【讨论】:

    • 或者非常简单的3 rotate'ccys
    【解决方案2】:

    因为 ccys 和 (-3 3) 的长度不同,所以您需要每个 left 和 each 都将带有 # 的 3 和 -3 应用于 ccys 中的每个字符串,而不是 ccys 本身。

    // each left will apply -3 & 3 # to the entire ccys list
    q)-3 3#:ccys
    "CADUSD" "NZDUSD" "USDAUD"
    "CADUSD" "NZDUSD" "USDAUD"
    
    // each both will then apply the -3 & 3 # to each nested string
    q)(-3,3)#':ccys
    "USD" "USD" "AUD"
    "CAD" "NZD" "USD"
    
    // flip then transposes the 2 by 3 matrix of strings 
    // to a 3 by 2 matrix of strings
    q)flip (-3,3)#':ccys
    "USD" "CAD"
    "USD" "NZD"
    "AUD" "USD"
    
    // this each right sv (scalar from vector) will merge each  
    // ccy into a currency pair. sv basically combines a list of strings,
    // seperated by the left argument which in this case is nothing / ""
    "" sv/:
    
    // I would more commonly use raze each for this part:
    q)raze each flip -3 3#':ccys
    "USDCAD"
    "USDNZD"
    "AUDUSD"
    

    至于更简单的方法,由于字符串的长度都相同,并且您只想交换第一个和最后 3 个字符,您可以深度索引来实现这一点:

    q)ccys[;3 4 5 0 1 2]
    "USDCAD"
    "USDNZD"
    "AUDUSD"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多