如何将函数应用于数组并形成两个单独的数组?
How do I apply a function to an array and form two separate arrays?
我正在使用 Ruby 2.4。我有一个包含字符串数据元素的数组,看起来像
["a word1 word2", "b eff", "a idaho orange", "new old shoe", "b mars", ...]
我想从上面形成两个数组,对数组的每个元素应用一个函数 (.split(/^(a|b)[[:space]]*/i
)。但是,我不知道如何形成两个单独的数组。以下
arr.map{ |x| x.split(/^(a|b)[[:space]]*/i) }
只生成一个数组,每个元素前面都有一个空白元素。理想情况下,我希望输出是两个数组,例如
["a", "b", "a", "", "b", ...]
["word1 word2", "eff", "idaho orange", "new old shoe", "mars", ...]
试试这个
arr.map { |x| a, b, c = x.partition(/^[ab]\s+/); [b.strip, a + c] }.transpose
这是如何工作的?
partition
将字符串拆分为 before-match,匹配和 post-match
b.strip
是没有尾随空格的匹配项
a + c
是完整字符串(如果没有匹配,完整字符串在 before-match 中)或 post-match
[..., ...]
创建一个元组,因此创建一个元组数组
transpose
切换二维数组的行和列
仅正则表达式
这是我能找到的最短的:
a1, a2 = arr.map{ |x| x.match(/((?:^[ab](?= ))?) *(.*)/).captures}.transpose
此示例现在适用于 "activity"
或 "ball"
。它检查 space 是否紧跟在字符串开头的 a
或 b
之后。
分裂与逻辑
另一种变体是:
a1, a2 = arr.map do |x|
parts = x.split(/(?<=^a|^b) +/)
parts.unshift('') if parts.size == 1
parts
end.transpose
我正在使用 Ruby 2.4。我有一个包含字符串数据元素的数组,看起来像
["a word1 word2", "b eff", "a idaho orange", "new old shoe", "b mars", ...]
我想从上面形成两个数组,对数组的每个元素应用一个函数 (.split(/^(a|b)[[:space]]*/i
)。但是,我不知道如何形成两个单独的数组。以下
arr.map{ |x| x.split(/^(a|b)[[:space]]*/i) }
只生成一个数组,每个元素前面都有一个空白元素。理想情况下,我希望输出是两个数组,例如
["a", "b", "a", "", "b", ...]
["word1 word2", "eff", "idaho orange", "new old shoe", "mars", ...]
试试这个
arr.map { |x| a, b, c = x.partition(/^[ab]\s+/); [b.strip, a + c] }.transpose
这是如何工作的?
partition
将字符串拆分为 before-match,匹配和 post-matchb.strip
是没有尾随空格的匹配项a + c
是完整字符串(如果没有匹配,完整字符串在 before-match 中)或 post-match[..., ...]
创建一个元组,因此创建一个元组数组transpose
切换二维数组的行和列
仅正则表达式
这是我能找到的最短的:
a1, a2 = arr.map{ |x| x.match(/((?:^[ab](?= ))?) *(.*)/).captures}.transpose
此示例现在适用于 "activity"
或 "ball"
。它检查 space 是否紧跟在字符串开头的 a
或 b
之后。
分裂与逻辑
另一种变体是:
a1, a2 = arr.map do |x|
parts = x.split(/(?<=^a|^b) +/)
parts.unshift('') if parts.size == 1
parts
end.transpose