2016-11-17 4 views
0

Есть ли способ, чтобы добавить в список произвольного типа, новый элемент этого типа, автоматическиЮлия - Добавление элементов в список определенного типа

Моя проблема, у меня есть словарь, с некоторыми ключи и каждое значение является массивом, и все массивы имеют одинаковую длину

a = Dict 
    x = [1,2,3] 
    y = ["a", "b", "c"] 
    z = [Dict(filled with stuff), Dict(also filled), Dict(filled)] 

проблема заключается в том, что мне нужно добавить к каждому элементу a с чем-то нейтральным, Fx мне нужно будет сделать один раунд , заполняющий, что приведет к

a = Dict 
    x = [1,2,3,0] 
    y = ["a", "b", "c", " "] 
    z = [Dict(filled with stuff), Dict(also filled), Dict(filled), Dict()] 

но a привычка всегда быть структурирована так, x, y и z может так же легко быть все массивы целых чисел, поплавки, или любое сочетание мыслимые

Т.Л., Др я могу push!() к массив каким-то автоматическим способом базовый элемент типа, который имеет массив? так что если массив определяется как Array{T}, я могу автоматически добавить тип T?

краткое объяснение

У меня есть файлы, которые включают в себя некоторые стандартные переменные, которые всегда присутствуют, но также будут дополнительные данные, но эти дополнительные данные меняются, но то, что они имеют в общем, то, что все переменные могут быть сгруппированы по длине, некоторые переменные будут массивами длины 95, некоторые из них будут длиной 72 и т. д., и именно так они группируются. Все дополнительные массивы будут помещены в словарь, но если данные будут добавлены, я хочу, чтобы словарь автоматически расширялся, чтобы длина по-прежнему соответствовала

+0

Возможно, сегодня я немного неспокойно, но я все еще не понимаю, что вы хотите. Не возражаете ли вы предоставить пример «псевдокода» того, что вы хотели бы сделать? –

+1

Привет @TasosPapastylianou У меня есть словарь, значения которого всегда являются массивами, но тип массивов всегда не известен, некоторые массивы могут иметь строки, другие плавать и т. Д., Я бы хотел нажать!() Для каждого массива в словаре, единый элемент с нейтральным элементом, т. е. пустая строка, 0.0 и т. д. Не тратьте впустую свое время, хотя я решил это (грубо), просто преобразовывая массивы в Array {Any} и нажимая на них пустую строку – isebarn

ответ

2

В целом, неясно, каково нейтральное значение типа. Таким образом, вы должны определить свою собственную функцию для каждого типа, например, как вы предложили для String с:

neutral(::Type{String}) = " " 

Для Number с, вы можете использовать встроенный в zero функции:

neutral{T<:Number}(::Type{T}) = zero(T) 

нейтральный элемент для Dict немного сложнее:

neutral{T<:Dict}(::Type{T}) = T() 
neutral{V}(::Type{Dict{TypeVar(:K),V}}) = Dict{Any, V}() 
neutral{K}(::Type{Dict{K}}) = Dict{K, Any}() 

Как запасной вариант, вы можете использовать пустую строку как в вашем комментарии:

neutral(x) = "" 

Наконец, вы можете определить функцию, чтобы подтолкнуть нейтральный элемент массива:

push_neutral!{T}(a::AbstractArray{T}) = push!(a, neutral(T)) 

Например:

push_neutral!([Dict(1=>2), Dict("1"=>2)]) 
3-element Array{Dict{K,Int64},1}: 
Dict(1=>2)  
Dict("1"=>2)  
Dict{Any,Int64}() 

Это также свидетельствует о необходимости для трех разных методов для Dict. Из-за смешанных типов, показанных параметром K, только это первое из трех определений недостаточно.

Edit: Применяя эту функцию к вашему Dicta держа все Array S можно просто сделать:

foreach(push_neutral!, values(a)) 

Edit2: Специализированная версия

neutral{K, V}(::Type{Dict{K, V}}) = Dict{K, V}() 

кажется ненужным.

Редактировать 3: A NullableArray, вероятно, лучшее решение вашей проблемы. Однако в текущей версии все еще сложно работать.

+0

, поскольку нет «элегантного «способ достичь этого. Я придерживаюсь массива« Любой », поскольку я не думаю, что могу видеть все возможные типы, которые могут быть, хотя строка, float и Dict() являются наиболее распространенными, может возникнуть некоторый нечетный тип, который будет распылять все , так что лучше безопасно, чем извините, но, в любом случае, спасибо за то, что нашли время, чтобы написать ответ – isebarn

Смежные вопросы