Опция грубой силы будет заключаться в том, чтобы получить количество вхождений на элемент, а затем отфильтровать этот вывод. Объект collections.Counter
прекрасно работает здесь:
l = [a,b,c,c,c,a,d,e,e,d,d]
c = Counter(l)
# Counter looks like {'a': 2, 'b': 1, 'c': 3...}
l = [item for item in l if c[item]>=3]
Под капотом Counter
действует как словарь, который вы можете построить себе так:
c = {}
for item in l:
# This will check if item is in the dictionary
# if it is, add to current count, if it is not, start at 0
# and add 1
c[item] = c.get(item, 0) + 1
# And the rest of the syntax follows from here
l = [item for item in l if c[item]>=3]
Вызов
CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator
получает десятичный разделитель для текущей культуры пользовательского интерфейса. Можно использовать другие культуры для получения разделителя для других языков.
Править
От 166 культур, о которых сообщают в моей системе (CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count()
), кажется, что используются только два разделителя: период и запятая. Можно попробовать это в системе:
var seps = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
.Select(ci => ci.NumberFormat.NumberDecimalSeparator)
.Distinct()
.ToList();
Предполагая, что это верно, этот метод может быть полезным (обратите внимание что keyCode
OR'ed с modifiers
отметьте для устранения недопустимых комбинаций):
private bool IsDecimalSeparator(Keys keyCode, Keys modifiers)
{
Keys fullKeyCode = keyCode | modifiers;
if (fullKeyCode.Equals(Keys.Decimal)) // value=110
return true;
string uiSep = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator;
if (uiSep.Equals("."))
return fullKeyCode.Equals(Keys.OemPeriod); // value=190
else if (uiSep.Equals(","))
return fullKeyCode.Equals(Keys.Oemcomma); // value=188
throw new ApplicationException(string.Format("Unknown separator found {0}", uiSep));
}
Последнее примечание: Согласно перечислению Ключей, значение 46, что Вы упоминаете, соответствует DEL (Удаляют) ключ (т.е. точка, когда Num Lock ВЫКЛЮЧЕНА).
Проблема здесь состоит в том что значения в KeyEventArgs
коды клавиши, не символы. Если Вы обрабатываете KeyPress
вместо этого, Вы вложите символ KeyPressEventArgs
который можно использовать для сравнения.
Примечание: Необходимо действительно выдержать сравнение NumberDecimalSeparator
символы, поскольку это - строка, ни один символ, таким образом, необходимо рассмотреть сценарии, где существует больше чем один символ в строке.