Julia中的Python样式列表

时间:2018-09-30 16:26:17

标签: python julia

以下代码按照我对Julia中的Python样式列表的预期操作:

julia> list1 = [Any, 123]
2-element Array{Any,1}:
    Any
 123

julia> list1[1] = "ABC"
"ABC"

julia> list1
2-element Array{Any,1}:
    "ABC"
 123

但是,此代码没有:

julia> list2 = [Any]
1-element Array{DataType,1}:
 Any

julia> list2[1] = "ABC"
ERROR: MethodError: Cannot `convert` an object of type String to an object of type DataType

我没想到两者之间会有这样的差异

julia> list1 = [Any, 123]
# and
julia> list2 = [Any]

所以我尝试使用any而不是Any

julia> list3 = [any, 123]
2-element Array{Any,1}:
    any
 123

julia> list3[1] = "ABC"
"ABC"

julia> list3
2-element Array{Any,1}:
    "ABC"
 123

这一切都奏效,但是我尝试了:

julia> list4 = [any]
1-element Array{typeof(any),1}:
 any

julia> list4[1] = "ABC"
ERROR: MethodError: Cannot `convert` an object of type String to an object of type typeof(any)

Julia的类型推断发生了什么,该现象解释了为什么list = [Any][any]会产生错误消息,如上所示,但是如果在“列表”创建时添加了其他类型,事情就可以了吗?

编辑

根据下面接受的答案中的有用示例,此方法可用于在Julia中创建Python样式的“列表”:

julia> pylist = Array{Any}(nothing, 5)
5-element Array{Any,1}:
 nothing
 nothing
 nothing
 nothing
 nothing

julia> pylist[1] = 123
123

julia> pylist[2] = 3.14
3.14

julia> pylist[3] = "ABC"
"ABC"

julia> pylist[4] = BigInt(12345)
12345

julia> pylist[5] = BigFloat(123.456)
1.234560000000000030695446184836328029632568359375e+02

编辑2

这是另一个示例,但是我到朱莉娅身边的时间还不够长,所以不知道这是否被认为是“朱利安”。感谢Julia专家的任何评论:

julia> PyList(n) = Array{Any}(nothing, n)
PyList (generic function with 1 method)

对于Julia的新手来说,这两行代码也可能会有所帮助

julia> Vector{Any}(nothing, 3)
3-element Array{Any,1}:
 nothing
 nothing
 nothing

julia> Vector{Any}(nothing, 3) == Array{Any}(nothing, 3)
true

因此,以上示例中的Vector{Any}只是Array{Any}的别名。以下是一些使用PyList的示例。

julia> pylst = PyList(3)
3-element Array{Any,1}:
 nothing
 nothing
 nothing

julia> pylst[1] = "ABC"
"ABC"  
julia> pylst[2] = 123
123
julia> pylst[3] = 3.14
3.14
julia> pylst
3-element Array{Any,1}:
    "ABC"
 123
   3.14

2 个答案:

答案 0 :(得分:5)

[Any, 123]并不意味着“使用单一元素123制作元素类型为Any的1元素数组”。这意味着“用元素Any和123组成一个数组”。 Any的元素类型是从给定的元素推导出来的,因为Any和123具有完全不相关的类型。

类似地,[Any]的意思是“用单个元素Any创建一个数组”。元素类型推导为DataType

如果要显式创建元素类型为Any的数组,可以通过将类型放在文字前面来实现。例如,具有单个元素Any的元素类型nothing的数组:

arr = Any[nothing]

还有一些方法可以创建指定大小的数组,例如

# 2x3 array of Any, all elements initialized to nothing
arr = Array{Any}(nothing, 2, 3)

答案 1 :(得分:2)

Python列表接受任何类型的元素,并且大小不固定,因此要创建新的Vector{Any},在Julia中只需执行Any[](注释在Python中)即可。

julia> x = Any[]        # >>> x = []
0-element Array{Any,1}  # >>> x
                        # []

julia> push!(x, 1)       # >>> x.append(1)
1-element Array{Any,1}:  # >>> x
 1                       # [1]

julia> push!(x, "2")     # >>> x.append("2")
2-element Array{Any,1}:  # >>> x
 1                       # [1, '2']
  "2"

没有Any的情况下,Julia推断下一个数组推导的类型为Vector{Int},因此您将无法使用其他类型的元素来推动或更改其Int元素。

julia> y = Any[i^2 for i in 1:3]  # >>> y = [i**2 for i in range(1, 4)]
3-element Array{Any,1}:           # >>> y
 1                                # [1, 4, 9]
 4
 9

julia> push!(y, "16")    # >>> y.append("16")
4-element Array{Any,1}:  # >>> y
 1                       # [1, 4, 9, '16']
 4
 9
  "16"

您可以使用两种语言创建实用程序功能以满足您的需求。

julia> list() = Any[]                  # >>> list
list (generic function with 1 method)  # <type 'list'>

julia> list(n::Integer) = Vector{Any}(undef, n)  # >>> def nlist(n):
list (generic function with 2 methods)           # ...     return [None for i in range(n)]

julia> list()           # >>> list()
0-element Array{Any,1}  # []

julia> list(3)           # >>> nlist(3)
3-element Array{Any,1}:  # [None, None, None]
 #undef
 #undef
 #undef