【问题标题】:How to check index in an Erlang list?如何检查 Erlang 列表中的索引?
【发布时间】:2019-11-29 14:44:24
【问题描述】:

我想如何创建一个来自两个不同列表的新列表,所以我制作了以下代码,但它给出了意想不到的结果。

我不知道为什么会这样。我想了解为什么会发生这种情况。

我的期望。

ListA = [1,2,3],

ListB = [a,b,c],

ListC = [{1,a}, {2,b}, {3,c}].

我得到了什么。

ListC = [{1,a},{1,b},{1,c},{2,a},{2,b},{2,c},{3,a},{3 ,b},{3,c}]

ListA = [1,2,3],
ListB = [a,b,c],
LictC = [{A, B} || A<-ListA, B<-ListB]

也许……

ListA = [1,2,3],
ListB = [a,b,c],
LictC = [{A, B} || A<-ListA, B<-ListB, Condition]

如果有一个函数可以检查数组的顺序,它可以是条件。具体来说,如果ListA的元素与ListB的元素具有相同的索引,则条件函数返回true

【问题讨论】:

  • 列表:zip(ListA,ListB).

标签: erlang


【解决方案1】:

真实

ListC = [{1,a},{1,b},{1,c},{2,a},{2,b},{2,c},{3,a},{3,b},{3,c}]

ListA = [1,2,3],
ListB = [a,b,c],
LictC = [{A, B} || A<-ListA, B<-ListB]

我不知道为什么会这样

因为这是定义列表推导的工作方式。具有两个生成器的列表推导式与其他语言中的两个嵌套 for 循环的工作方式完全相同:

#python

listA = [1,2,3]
listB = ["a", "b", "c"]
results = []

for a in listA:
    for b in listB:
        results.append((a,b))

print(results)

输出:

[(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), 
 (3, 'a'), (3, 'b'), (3, 'c')]

你取 ListA 的第一个元素,并将它与 ListB 的每个元素结合起来;然后你取 ListA 的第二个元素,并将它与 ListB 的每个元素结合起来;等等

我该如何解决这个问题

“当你有一把锤子(列表推导式)时,一切看起来都像钉子。”在这种情况下,您使用了错误的工具来完成这项工作。相反,您应该使用lists:zip/2 来获得您想要的结果:

1> ListA = [1,2,3].
[1,2,3]

2> ListB = [a,b,c].
[a,b,c]

3> lists:zip(ListA, ListB).
[{1,a},{2,b},{3,c}]

或者,您可以定义自己的递归函数来做您想做的事情:

-module(a).
-compile(export_all).

combine([], []) -> [];
combine([H1|T1], [H2|T2]) ->
    [{H1,H2} | combine(T1, T2)].

在外壳中:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> c(a).                      
a.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,a}

2> a:combine([1,2,3], [a,b,c]).
[{1,a},{2,b},{3,c}]

3> 

如果 ListA 的元素与 ListB 的元素具有相同的索引

在 erlang 中,列表的元素没有索引位置。 Erlang 列表与 C/C++ 中的 python 列表或数组不同。相反,erlang 列表被实现为链表,其元素可以顺序访问,但不能随机访问。

【讨论】:

  • 总体不错的答案,但我不同意“在 erlang 中,列表的元素没有索引位置”。他们当然可以,并且可以被他们访问;只是不是在恒定的时间,这在这种情况下不相关。
  • 谢谢!这种情况下已经有了 std 函数。而且递归函数也很有帮助。
猜你喜欢
  • 1970-01-01
  • 2014-12-29
  • 2015-12-26
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多