Это работает
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)
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
(и затем создания нового словаря). Сказав это, я не вижу в этом проблемы,
Ну, если не считать проблем с производительностью или читабельностью, нельзя ли это сделать так:
<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 . Это может или не может улучшить что-либо, но это идея.