如何 运行 枚举具有另一个可枚举条件的函数?
How to run enum functions with conditions of another enumerable?
发现很难用语言表达我的问题..
我有一个函数可以根据特定条件对可枚举进行排序,我还有另一个用 Enum.take(x, -1)
指定的可枚举
Enum.map(list, fn x -> Enum.take(x, 1) end)
|> Enum.map(fn x -> Enum.join(x) end)
|> Enum.sort(&(byte_size(&1) > byte_size(&2)))
|> Enum.with_index
我想做的是将此函数应用于第二个可枚举但具有第一个的条件,以便项目与第一个的原始位置匹配,有点像这样:
iex(1)> x = [1,2,3,4,5]
[1, 2, 3, 4, 5]
iex(2)> y = [:a,:b,:c,:d,:e]
[:a, :b, :c, :d, :e]
...
# arbitrary code to sort x such that x = [5,4,3,2,1]
# and y is sorted with the same conditions applied to x such that..
...
iex(4)> y = [:e,:d,:c,:b,:a]
[:e, :d, :c, :b, :a]
我怎样才能做到这一点?我可以使用哪种解决方法,或者是否有任何特定的语言功能可以满足我的需要?
我希望我的问题是有道理的,感谢您的阅读 :>
我认为您要做的是一个 属性 按另一个 属性 排序的列表。我想你可以这样做:
xs = [5, 4, 3, 2, 1]
ys = [:a, :b, :c, :d, :e]
Enum.zip(xs, ys) # Produces a list of pairs like {5, :a}, etc.
|> Enum.sort_by(fn {x, _y} -> x end)
|> Enum.map(&elem(&1, 1))
# => [:e, :d, :c, :b, :a]
所以基本上将您的数据打包成对,对这些对进行排序,然后解压第二个元素。
你实际上可以只 Enum.sort()
而不是 sort_by
,因为元组的默认顺序是先比较第一个元素,如果第一个元素相等,则比较第二个,等等,但这是也许更明确。
发现很难用语言表达我的问题..
我有一个函数可以根据特定条件对可枚举进行排序,我还有另一个用 Enum.take(x, -1)
Enum.map(list, fn x -> Enum.take(x, 1) end)
|> Enum.map(fn x -> Enum.join(x) end)
|> Enum.sort(&(byte_size(&1) > byte_size(&2)))
|> Enum.with_index
我想做的是将此函数应用于第二个可枚举但具有第一个的条件,以便项目与第一个的原始位置匹配,有点像这样:
iex(1)> x = [1,2,3,4,5]
[1, 2, 3, 4, 5]
iex(2)> y = [:a,:b,:c,:d,:e]
[:a, :b, :c, :d, :e]
...
# arbitrary code to sort x such that x = [5,4,3,2,1]
# and y is sorted with the same conditions applied to x such that..
...
iex(4)> y = [:e,:d,:c,:b,:a]
[:e, :d, :c, :b, :a]
我怎样才能做到这一点?我可以使用哪种解决方法,或者是否有任何特定的语言功能可以满足我的需要?
我希望我的问题是有道理的,感谢您的阅读 :>
我认为您要做的是一个 属性 按另一个 属性 排序的列表。我想你可以这样做:
xs = [5, 4, 3, 2, 1]
ys = [:a, :b, :c, :d, :e]
Enum.zip(xs, ys) # Produces a list of pairs like {5, :a}, etc.
|> Enum.sort_by(fn {x, _y} -> x end)
|> Enum.map(&elem(&1, 1))
# => [:e, :d, :c, :b, :a]
所以基本上将您的数据打包成对,对这些对进行排序,然后解压第二个元素。
你实际上可以只 Enum.sort()
而不是 sort_by
,因为元组的默认顺序是先比较第一个元素,如果第一个元素相等,则比较第二个,等等,但这是也许更明确。