Apl 基于值从矩阵中选择的惯用方法

Apl 基于值从矩阵中选择的惯用方法,apl,dyalog,Apl,Dyalog,下面的员工姓名和电子邮件地址矩阵直观地表明鲍勃的电子邮件地址是bob@example.com ┌───────┬─────────────────────┐ │alice │alice@example.com │ ├───────┼─────────────────────┤ │bob │bob@example.com │ ├───────┼─────────────────────┤ │charlie│charlie47@example.com│ └───────┴──

下面的
员工
姓名和电子邮件地址矩阵直观地表明
鲍勃
的电子邮件地址是
bob@example.com

┌───────┬─────────────────────┐
│alice  │alice@example.com    │
├───────┼─────────────────────┤
│bob    │bob@example.com      │
├───────┼─────────────────────┤
│charlie│charlie47@example.com│
└───────┴─────────────────────┘
但是如何根据第1列中的给定值以编程方式访问电子邮件地址?到目前为止,我发现最好的方法是

(⊂'bob') {(⍵[;1]⍳⍺) 2 ⌷⍵} employees
这是可行的,但相当冗长——我觉得我肯定错过了一个更简单的方法来做一些我认为相当常见的事情

有关于我遗漏什么的提示吗

您的函数可以通过多种方式表达,但它们都是沿着这些轨道:

(⊂'鲍勃‘){(⍺⍳⍨⊣/⍵)⌷⊢/⍵}受雇者
但是,使用函数可能太抽象,因为您可能希望使用索引从不同的表中提取

employee[employee[;1]⍳⊂'鲍勃;2]
为便于阅读,您可以将列命名为:

(姓名电子邮件)←⍳2.
雇员[雇员[姓名]⍳⊂'鲍勃;电子邮件]
但经典的方法实际上是为每列使用单独的数组:

(姓名电子邮件)←↓⍉受雇者
电子邮件⌷⍨名称⍳⊂'鲍勃的
对于更多组织(避免每列一个名称污染工作区),您可以在命名空间中收集它们:

(员工)←⎕NS⍬).(姓名电子邮件)←↓⍉受雇者
员工:(电子邮件)⌷⍨名称⍳⊂)'鲍勃的

如果希望获得最佳的数据库性能,应为每列指定一个固定的字段宽度:

(姓名电子邮件)←10 30(⊢↑⍨⊢∘≢,⊣)¨↑¨↓⍉受雇者
电子邮件⌷⍨名称⍳10↑'鲍勃的
当然,您可以将这些列放入名称空间,但也可以将这些列存储为向量的元素,这称为倒排表

employeeIT←10 30(⊢↑⍨⊢∘≢,⊣)¨↑¨↓⍉受雇者
(姓名电子邮件)←⍳2.
(电邮⊃雇员(IT)⌷⍨(姓名)⊃雇员(IT)⍳10↑'鲍勃的

实现高性能的另一种方法是使用
这会导致APL生成哈希表。事实上,您也可以将电子邮件列表与索引绑定,并采用完全实用的方法:

(姓名电子邮件)←↓⍉受雇者
名称←名称∘⍳
电子邮件←⌷∘电子邮件
电子邮件名称⊂'鲍勃的
您的函数可以通过多种方式表达,但它们都是沿着这些轨道:

(⊂'鲍勃‘){(⍺⍳⍨⊣/⍵)⌷⊢/⍵}受雇者
但是,使用函数可能太抽象,因为您可能希望使用索引从不同的表中提取

employee[employee[;1]⍳⊂'鲍勃;2]
为便于阅读,您可以将列命名为:

(姓名电子邮件)←⍳2.
雇员[雇员[姓名]⍳⊂'鲍勃;电子邮件]
但经典的方法实际上是为每列使用单独的数组:

(姓名电子邮件)←↓⍉受雇者
电子邮件⌷⍨名称⍳⊂'鲍勃的
对于更多组织(避免每列一个名称污染工作区),您可以在命名空间中收集它们:

(员工)←⎕NS⍬).(姓名电子邮件)←↓⍉受雇者
员工:(电子邮件)⌷⍨名称⍳⊂)'鲍勃的

如果希望获得最佳的数据库性能,应为每列指定一个固定的字段宽度:

(姓名电子邮件)←10 30(⊢↑⍨⊢∘≢,⊣)¨↑¨↓⍉受雇者
电子邮件⌷⍨名称⍳10↑'鲍勃的
当然,您可以将这些列放入名称空间,但也可以将这些列存储为向量的元素,这称为倒排表

employeeIT←10 30(⊢↑⍨⊢∘≢,⊣)¨↑¨↓⍉受雇者
(姓名电子邮件)←⍳2.
(电邮⊃雇员(IT)⌷⍨(姓名)⊃雇员(IT)⍳10↑'鲍勃的

实现高性能的另一种方法是使用
这会导致APL生成哈希表。事实上,您也可以将电子邮件列表与索引绑定,并采用完全实用的方法:

(姓名电子邮件)←↓⍉受雇者
名称←名称∘⍳
电子邮件←⌷∘电子邮件
电子邮件名称⊂'鲍勃的

这似乎更长

  A←3 2⍴('Alice')('ralice@1')('bob')('abob@2')('charlie')('gchiarli@3')
  A
Alice   ralice@1   
bob     abob@2     
charlie gchiarli@3 
  q←{C←⍺⋄0=+/D←{C≡⍵}¨↑¨B←{{w[⍵;]}¨⍳≢w←⍵}⍵:⍬⋄↑1↓↑D/B}
  ⎕fmt ('charlie') q A
┌10─────────┐
│ gchiarli@3│
└───────────┘
  ⎕fmt ('') q A
┌0─┐
│ 0│
└~─┘
  ⎕fmt ('1') q A
┌0─┐
│ 0│
└~─┘
  ⎕fmt (1) q A
┌0─┐
│ 0│
└~─┘
  ⎕fmt 1 q A
┌0─┐
│ 0│
└~─┘
  ⎕fmt 'bob' q A
┌6──────┐
│ abob@2│
└───────┘

这似乎更长

  A←3 2⍴('Alice')('ralice@1')('bob')('abob@2')('charlie')('gchiarli@3')
  A
Alice   ralice@1   
bob     abob@2     
charlie gchiarli@3 
  q←{C←⍺⋄0=+/D←{C≡⍵}¨↑¨B←{{w[⍵;]}¨⍳≢w←⍵}⍵:⍬⋄↑1↓↑D/B}
  ⎕fmt ('charlie') q A
┌10─────────┐
│ gchiarli@3│
└───────────┘
  ⎕fmt ('') q A
┌0─┐
│ 0│
└~─┘
  ⎕fmt ('1') q A
┌0─┐
│ 0│
└~─┘
  ⎕fmt (1) q A
┌0─┐
│ 0│
└~─┘
  ⎕fmt 1 q A
┌0─┐
│ 0│
└~─┘
  ⎕fmt 'bob' q A
┌6──────┐
│ abob@2│
└───────┘

所有这些信息都非常丰富,谢谢!最后一种方法特别漂亮;从中推断一点让我意识到我可以任意将任何矩阵视为哈希表。给定一个具有命名列的矩阵,我可以编写
⌷∘名称1(名称2∘⍳) 以
name2
为目标,任意将
name2
视为哈希表的键。哇!(当然,只有当
name2
是唯一的时,这才有效,但它仍然比哈希映射只有一个固定键的语言要好得多)所有这些信息都非常丰富,谢谢!最后一种方法特别漂亮;从中推断一点让我意识到我可以任意将任何矩阵视为哈希表。给定一个具有命名列的矩阵,我可以编写
⌷∘名称1(名称2∘⍳) 以
name2
为目标,任意将
name2
视为哈希表的键。哇!(当然,只有当
name2
是唯一的时,这才有效,但它仍然比哈希映射只有一个固定键的语言要好得多)