Julia:按子字符串包含对字符串数组排序
我有一些非常难看的代码来对包含几个月的子字符串的字符串数组进行排序 因此:Julia:按子字符串包含对字符串数组排序,julia,Julia,我有一些非常难看的代码来对包含几个月的子字符串的字符串数组进行排序 因此: months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"] test = ["xxxFebxxx","xxxJanxxx","xxxAprxxx"] function sortf(s) ix = 0 for m in months if contains(s,m)==true
months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
test = ["xxxFebxxx","xxxJanxxx","xxxAprxxx"]
function sortf(s)
ix = 0
for m in months
if contains(s,m)==true
return ix
end
ix = ix + 1
end
return size(months)[1] # in case substring not found
end
sort!(test,by=sortf)
# result should be ["xxxJanxxx","xxxFebxxx","xxxAprxxx"]
通过在几个月内检查子字符串对测试进行排序的简洁方法是什么?简洁的一行是:
sort!(test,by=t->first(filter(x->contains(t,x[2]),enumerate([months;""])))[1])
使用的功能:
在[months;“”]
以复制将没有月子字符串的测试字符串移动到列表末尾的过程月底添加一个伪字符串
为每个月添加一个数字,以提取供enumerate()
排序使用代码>
检查(数字、月份)对的集合,并在字符串中搜索月份。恼人的是,filter()
本身可能会生成警告,并且可以用filter
可以避免它迭代器替换。filter
获取第一个(数字,月份)对,停止first()[1]
并返回月份号filter
类似于所讨论的行排序!(,by=)
test[
sortperm(vec(mapslices(findfirst,contains.(test,reshape([months;""],1,:)),2)))
]
可以使用点广播来获得这一行。对我来说,这本书可读性很强,但肯定不会很有效率
test[sortperm(findfirst.([contains.(x,[months;“”))表示测试中的x]),by=x->x[1])
使用
findfirst
编辑以反映@DanGetz的评论在这里更好。此外,将months
替换为[months;“”]
不会复制问题中的月份字符串行为谢谢,必须将筛选器替换为迭代器。中不推荐使用筛选器作为筛选器。6