对数字列表进行排序

对数字列表进行排序

在我的例子中,我想将两个列表放在一起,然后对它们进行排序

    \def\Wmax{10^8}
    \def\Wmin{.01}
\def\mySamplLst{\Wmin}
\xdef\mySamplNb{10}
\pgfmathparseFPU{(\Wmax/\Wmin)^(1/\mySamplNb)}
\xdef\myStep{\pgfmathresult}
\foreach \i in {1,2,...,\mySamplNb} {\pgfmathparseFPU{\Wmin*(\myStep^(\i))}
  \xdef\mySamplLst{\mySamplLst,\pgfmathresult}}
  
\def\mySamplNb{10}
\def\mySamplCenter{10}
\def\mySamplwidth{2}
\pgfmathparseFPU{\mySamplwidth^(1/\mySamplNb)}
\xdef\myStep{\pgfmathresult}
\foreach \i in {-\mySamplNb,...,-1,0,1,2,...,\mySamplNb} {\pgfmathparseFPU{\mySamplCenter*(\myStep^(\i))}
  \xdef\mySamplLst{\mySamplLst,\pgfmathresult}}

\mySamplLst

它会给出类似的信息:一旦你完成了四舍五入。

.01,0.1,1,10,100,1000,10000,100000,1000000,10000000,10000000,5,5,5,6,6,7,7,8,8,9,10,10,11,12,13,14,15,16,17,18,19

如果你想知道我将在samples at=半对数图中使用该列表

  • 您知道如何对这份清单进行排序吗?

这看起来像是一个直接的要求,它应该是最简单的\sort{s,o,r,t,e,d}给出一个包含{d,e,o,r,s,t}但不...的列表......我一直在对特定对象进行排序的帖子和 l3sort 的文档之间漫无目的地徘徊,没有提供任何有效的例子......

好吧,我可以停止这种咆哮了......

感谢您的时间。

(我认真考虑放弃 latex 计算并开始使用 python 来生成 latex,因为每个小任务似乎都需要 1 天的工作,找一个以 latex 源代码为第一语言的熟人或在这里准备一个可读的问题并等待慷慨的专家。)

是的,我知道对随机生成的数字列表进行排序我无法理解这到底是什么情况。

附言:您知道吗,如果我将提供的代码(没有显示列表的最后一行)放在我的独立文档中,它实际上会占用一些空间...它只是计算,没有显示,但仍然占用文档空间...我发誓有时候我觉得 LaTeX 是故意让人发疯的。

答案1

这里需要的核心思想是排序代码需要使用某种类型的比较。这里,我们比较浮点值,所以我们需要\fp_compare:nNnTF

  \clist_sort:Nn \mySamplLst
    {
      \fp_compare:nNnTF {#1} > {#2}
        { \sort_return_swapped: }
        { \sort_return_same: }
    }

即,如果第一个值大于第二个值,我们交换,而如果第二个值更大,我们保持不变。

如果您想将其包装在命令中以应用于任何旧的逗号列表,这很容易 - 我们只需要跟踪嵌套。

\NewDocumentCommand \SortSampleList { m }
  {
    \clist_sort:Nn #1
      {
        \fp_compare:nNnTF {##1} > {##2}
          { \sort_return_swapped: }
          { \sort_return_same: }
      }
  }

我看到您已经将其pgf用于数学,但由于我们已经使用该expl3代码进行排序,因此我倾向于将其也用于数学。保留变量命名但重新工作expl3会给我带来

\def\Wmax{10^8}
\def\Wmin{.01}
\def\mySamplNb{10}

\ExplSyntaxOn
\clist_new:N \mySamplLst
\clist_put_right:Nx \mySamplLst { \fp_eval:n { \Wmin } }
\fp_set:Nn \myStep { (\Wmax/\Wmin)^(1/\mySamplNb) }
\int_step_inline:nnnn { 1 } { 1 } { \mySamplNb }
  {
    \clist_put_right:Nx \mySamplLst
      {
         \fp_eval:n { \Wmin*(\myStep^(#1)) }
      }
  }
\ExplSyntaxOff
  
\def\mySamplNb{10}
\def\mySamplCenter{10}
\def\mySamplwidth{2}

\ExplSyntaxOn

\fp_set:Nn \myStep {\mySamplwidth^(1/\mySamplNb)}
\int_step_inline:nnnn { -\mySamplNb } { 1 } { \mySamplNb }
  {
    \clist_put_right:Nx \mySamplLst
      {
         \fp_eval:n {\mySamplCenter*(\myStep^(#1))}
      }
  }

  \clist_sort:Nn \mySamplLst
    {
      \fp_compare:nNnTF { #1 } > { #2 }
        { \sort_return_swapped: }
        { \sort_return_same: }
    }

\ExplSyntaxOff

您可以跳过预先计算步长:这不是必需的,但我不想过多地改变您的代码。

相关内容