gpt4 book ai didi

arrays - 从数组中提取重复元素(范围错误的错误值)

转载 作者:太空宇宙 更新时间:2023-11-03 17:14:09 24 4
gpt4 key购买 nike

我想从这个数组中提取/抓取标签“:desc:”和“:/desc”之间的所有元素

array = ["hello", ":desc:", "claire", "et", "concise", ":/desc:",
":desc:", "claire", "caca", "concise", "test", ":/desc:"]

所以我有

new_array = [[":desc:", "claire", "et", "concise", ":/desc:"],
[":desc:", "claire", "caca", "concise", "test", ":/desc:"]]

我试过了

final_array = []

start_element = ':desc:'
end_element = ':/desc:'

while array.any?
final_array << array.slice!
(array.find_index(start_element)..array.find_index(end_element))
end

但它显然不起作用,因为我得到了一个 bad value for range 错误。

最佳答案

这里有几个问题。从您的示例数组看来,结束元素是 ':/desc' 而不是 ':/desc:' (即没有尾随 : ).不过,这可能只是问题中的错字。

主要问题是删除 2 个切片后数组将不会为空(它仍将包含第一个 start_element 之前的 "hello"。这意味着当 find_index(start_element) 找不到匹配元素时,array.any? 条件仍然为真。在这种情况下,find_index 将返回 nil,导致在尝试使用 slice!没有从 nil 到整数的隐式转换

如果您知道您的数据将始终包含成对的 start_elementend_element,那么一种方法是:

while start_index = array.find_index(start_element)
end_index = array.find_index(end_element)
final_array << array.slice!(start_index..end_index)
end

当将来遇到这种错误时,一些可靠的 puts 调试会有所帮助,在这种情况下检查 2 个索引和数组的剩余内容:

while array.any?
start_index = array.find_index(start_element)
end_index = array.find_index(end_element)
puts "#{start_index}..#{end_index}"
final_array << array.slice!(start_index..end_index)
puts array.inspect
end

1..5
["hello", ":desc:", "claire", "caca", "concise", "test", ":/desc"]
1..6
["hello"]
..
TypeError: no implicit conversion from nil to integer
from (pry):146:in `slice!'

关于arrays - 从数组中提取重复元素(范围错误的错误值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46026009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com