Как я могу использовать LINQ для “сокращения” словаря?

Это работает

from pprint import pprint
from string import punctuation

counts = {"Joke": 0, "Ad": 0, "None": 0}
with open("TipJoke.csv", "r") as f:
    for line in f:
        line_clean = line.replace('"', "").replace("\n", "").split(",")
        try:
            counts[line_clean[1]] += int(line_clean[2])
        except:
            pass


print(counts)
5
задан scottm 6 May 2009 в 17:10
поделиться

2 ответа

var pruned = etimes.Where(entry => Convert.ToInt64(entry.Value) >= 
    Convert.ToInt64(stime)).ToDictionary(entry => entry.Key, 
        entry => entry.Value);

Этот оператор просто фильтрует словарь, используя LINQ Где функция, чтобы выбрать, какие элементы оставить , а не те, которые нужно удалить (что затем требует дополнительного кода, как вы показали). ToDictionary преобразует thwe IEnumerable > в желаемый тип Dictionary и является по меньшей мере довольно простым, если не очень элегантно или эффективно из-за необходимости указывать два лямбда-выражения для выбора ключа и значения из KeyValuePair (и затем создания нового словаря). Сказав это, я не вижу в этом проблемы,

6
ответ дан 14 December 2019 в 13:46
поделиться

Ну, если не считать проблем с производительностью или читабельностью, нельзя ли это сделать так:

<Extension> void itemDelete(List l, object item) {
    l.Remove(item)
}

var keys = (from entry in etimes
        where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime)
        select entry.Key).ToList();

keys.foreach(itemDelete());

Простите мое кодирование, я не на 100% уверен в точном синтаксисе (особенно в C #); рассмотреть этот псевдокод. Обратите внимание на добавление новой функции и функции .foreach в конце запроса LINQ. Я знаю, что это было бы возможно в VB, я предполагаю, что в C # есть нечто подобное ... если бы не вы, вы всегда можете написать свое собственное расширение .foreach . Это может или не может улучшить что-либо, но это идея.

0
ответ дан 14 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

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