Конечно. Перебирайте членов сервера, проверяйте роль и удаляйте их, если у них ее нет
from discord.utils import get
@bot.command(pass_context=True)
async def purge_members(ctx):
for member in ctx.message.server.members:
if not get(member.roles, name='member'):
await bot.kick(member)
Править: Ай... Это стало немного более твердым, в то время как я не смотрел. Изменением требований может быть реальный ЛАВАШ.
Хорошо, поэтому займите каждую позицию в массиве и суммируйте его:
var sums = Enumerable.Range(0, myList[0].Length)
.Select(i => myList.Select(
nums => nums[i]
).Sum()
);
Это - вид ужасных..., но я думаю, что версия оператора была бы еще хуже.
Править: Я оставил это здесь ради интереса, но принятый ответ намного более хорош.
Править: Хорошо, моя предыдущая попытка (см. историю редактирования) была в основном абсолютно неправильной...
Можно сделать это с одной строкой LINQ, но это ужасно:
var results = myList.SelectMany(array => array.Select(
(value, index) => new { value, index })
.Aggregate(new int[myList[0].Length],
(result, item) => { result[item.index] += value; return result; });
Я не протестировал его, но я думаю, что это должно работать. Я не рекомендовал бы это все же. SelectMany сглаживает все данные в последовательность пар - каждая пара является значением и его индексом в его исходном массиве.
Совокупный шаг совершенно нечист - он изменяет свой аккумулятор, когда он идет путем добавления правильного значения в правой точке.
Если любой не может думать о способе в основном поворота Ваших исходных данных (в которой точке мой более ранний ответ - то, что Вы хотите), я подозреваю, что Вы являетесь лучшими от выполнения этого non-LINQ путь.
Это работает с любыми 2 последовательностями, не просто выстраивает:
var myList = new List<int[]>
{
new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90 }
};
var sums =
from array in myList
from valueIndex in array.Select((value, index) => new { Value = value, Index = index })
group valueIndex by valueIndex.Index into indexGroups
select indexGroups.Select(indexGroup => indexGroup.Value).Sum()
foreach(var sum in sums)
{
Console.WriteLine(sum);
}
// Prints:
//
// 11
// 22
// 33
// 44
// 55
// 66
// 77
// 88
// 99
Хорошо, принятие, мы можем предположить, что сумма ints в каждом положении по списку массивов самостоятельно впишется в интервал (который является изворотливым предположением, но я сделаю его так или иначе для создания задания легче):
int[] sums =
Enumerable.Range(0, listOfArrays[0].Length-1).
Select(sumTotal =>
Enumerable.Range(0, listOfArrays.Count-1).
Aggregate((total, listIndex) =>
total += listOfArrays[listIndex][sumTotal])).ToArray();
РЕДАКТИРОВАНИЕ - D'oh. По некоторым причинам.Select уклонился от меня первоначально. Это немного лучше. Это - небольшой взлом, потому что sumTotal действует как оба вход (положение в массиве, который используется в Совокупном вызове), и выходная сумма в получающемся IEnumerable, который парадоксален.
Откровенно это намного более ужасно, чем выполнение его старый-fasioned путь :-)
Вот тот, который торгует простотой оператора Linq с производительностью.
var colSums =
from col in array.Pivot()
select col.Sum();
public static class LinqExtensions {
public static IEnumerable<IEnumerable<T>> Pivot<T>( this IList<T[]> array ) {
for( int c = 0; c < array[ 0 ].Length; c++ )
yield return PivotColumn( array, c );
}
private static IEnumerable<T> PivotColumn<T>( IList<T[]> array, int c ) {
for( int r = 0; r < array.Count; r++ )
yield return array[ r ][ c ];
}
}
Я сделал бы это следующим образом …, но это решение могло бы на самом деле быть очень медленным, таким образом, Вы могли бы хотеть выполнить сравнительный тест прежде, чем развернуть его в критических по отношению к производительности разделах.
var result = xs.Aggregate(
(a, b) => Enumerable.Range(0, a.Length).Select(i => a[i] + b[i]).ToArray()
);