真实
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 列表被实现为链表,其元素可以顺序访问,但不能随机访问。