Лучшая реализация для Структуры данных Пары Значения ключа?

Я думаю, что ранее упомянутый ответ включения decimal="," в pandas read_csv является предпочтительным вариантом.

Однако я обнаружил, что он несовместим с механизмом синтаксического анализа Python. например при использовании skiprow= read_csv вернется к этому движку и, следовательно, вы не сможете использовать skiprow= и decimal= в том же самом read_csv, насколько я знаю. Кроме того, мне не удалось фактически заставить оператор decimal= работать (возможно, из-за меня)

. Длинный путь, который я использовал для достижения того же результата, - это понимание списков, .replace и .astype. Главным недостатком этого метода является то, что он должен выполняться по одному столбцу за раз:

df = pd.DataFrame({'a': ['120,00', '42,00', '18,00', '23,00'], 
                'b': ['51,23', '18,45', '28,90', '133,00']})

df['a'] = [x.replace(',', '.') for x in df['a']]

df['a'] = df['a'].astype(float)

Теперь столбец a будет иметь ячейки типа float. Столбец b все еще содержит строки.

Обратите внимание, что используемая здесь .replace не является пандой, а встроенной версией Python. Версия Pandas требует, чтобы строка была точным совпадением или регулярным выражением.

72
задан Chris 25 August 2008 в 12:57
поделиться

8 ответов

Существует фактический Тип данных под названием KeyValuePair, используйте как это

KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");
135
ответ дан Francis P 7 November 2019 в 08:24
поделиться

Одна возможная вещь, которую Вы могли сделать, использовать Словарь, возражают прямо из поля и затем просто расширяют его с помощью Ваших собственных модификаций:

public class TokenTree : Dictionary<string, string>
{
    public IDictionary<string, string> SubPairs;
}

Это дает Вам преимущество не необходимости осуществить правила IDictionary для Вашего Ключа (например, ключевая уникальность, и т.д.).

И да Вы разобрались в понятии о конструкторе:)

12
ответ дан Jon Limjap 7 November 2019 в 08:24
поделиться

Я думаю, чем Вы могли бы быть после (как литеральная реализация Вашего вопроса):

public class TokenTree
{
    public TokenTree()
    {
        tree = new Dictionary<string, IDictionary<string,string>>();
    }

    IDictionary<string, IDictionary<string, string>> tree; 
}

Вы действительно на самом деле говорили "список" значений ключа в Вашем вопросе, таким образом, Вы могли бы хотеть подкачать внутреннее IDictionary с a:

IList<KeyValuePair<string, string>>
7
ответ дан Patrick 7 November 2019 в 08:24
поделиться

Существует KeyValuePair встроенный тип. На самом деле, это - то, что IDictionary предоставляет Вам доступ к тому, когда Вы выполняете итерации в нем.

кроме того, эта структура является едва деревом, находя, что более представительное имя могло бы быть хорошим осуществлением.

5
ответ дан Coincoin 7 November 2019 в 08:24
поделиться

Всего одна вещь добавить к этому (хотя я действительно думаю, что Вам уже ответили на Ваш вопрос другие). В интересах расширяемости (так как все мы знаем это, произойдет в какой-то момент) можно хотеть проверить Составной Шаблон , Это идеально для работы с "Древовидными Структурами"..

Как я сказал, я знаю, что Вы только ожидаете один подуровень, но это могло действительно быть полезно для Вас, если позже необходимо расширить ^_^

3
ответ дан Rob Cooper 7 November 2019 в 08:24
поделиться

Класс Словаря точно, что Вы хотите, корректный.

можно объявить поле непосредственно как Словарь, вместо IDictionary, но Вам решать

1
ответ дан angry person 7 November 2019 в 08:24
поделиться

Используйте что-то вроде этого:

class Tree < T > : Dictionary < T, IList< Tree < T > > >  
{  
}  

Это ужасно, но я думаю, что это даст Вам, что Вы хотите. Слишком плохой KeyValuePair изолируется.

1
ответ дан kokos 7 November 2019 в 08:24
поделиться

Jay Mooney : универсальный класс Словаря в.NET является на самом деле хэш-таблицей, только с фиксированными типами.

код, который Вы показали, не должен убеждать никого использовать Хеш-таблицу вместо Словаря, так как обе части кода могут использоваться для обоих типов.

Для хеш-таблицы:

foreach(object key in h.keys)
{
     string keyAsString = key.ToString(); // btw, this is unnecessary
     string valAsString = h[key].ToString();

     System.Diagnostics.Debug.WriteLine(keyAsString + " " + valAsString);
}

Для словаря:

foreach(string key in d.keys)
{
     string valAsString = d[key].ToString();

     System.Diagnostics.Debug.WriteLine(key + " " + valAsString);
}

И все равно для другого с KeyValuePair, просто используйте неуниверсальную версию для Хеш-таблицы и универсальную версию для Словаря.

, Таким образом, это столь же легко оба пути, но Объект использования Хеш-таблицы и для ключа и для значения, что означает Вас, упакует все типы значения, и у Вас нет безопасности типов, и Словарь использует универсальные типы и таким образом лучше.

2
ответ дан Community 7 November 2019 в 08:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: