Как я суммирую список <> массивов

Конечно. Перебирайте членов сервера, проверяйте роль и удаляйте их, если у них ее нет

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)
13
задан Will Dean 26 October 2009 в 16:18
поделиться

6 ответов

Править: Ай... Это стало немного более твердым, в то время как я не смотрел. Изменением требований может быть реальный ЛАВАШ.

Хорошо, поэтому займите каждую позицию в массиве и суммируйте его:

var sums = Enumerable.Range(0, myList[0].Length)
           .Select(i => myList.Select(
                     nums => nums[i]
                  ).Sum()
           );

Это - вид ужасных..., но я думаю, что версия оператора была бы еще хуже.

11
ответ дан 1 December 2019 в 23:16
поделиться

Править: Я оставил это здесь ради интереса, но принятый ответ намного более хорош.

Править: Хорошо, моя предыдущая попытка (см. историю редактирования) была в основном абсолютно неправильной...

Можно сделать это с одной строкой 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 путь.

4
ответ дан 1 December 2019 в 23:16
поделиться

Это работает с любыми 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
2
ответ дан 1 December 2019 в 23:16
поделиться

Хорошо, принятие, мы можем предположить, что сумма 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 путь :-)

1
ответ дан 1 December 2019 в 23:16
поделиться

Вот тот, который торгует простотой оператора 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 ];
    }
}
1
ответ дан 1 December 2019 в 23:16
поделиться

Я сделал бы это следующим образом …, но это решение могло бы на самом деле быть очень медленным, таким образом, Вы могли бы хотеть выполнить сравнительный тест прежде, чем развернуть его в критических по отношению к производительности разделах.

var result = xs.Aggregate(
    (a, b) => Enumerable.Range(0, a.Length).Select(i => a[i] + b[i]).ToArray()
);
0
ответ дан 1 December 2019 в 23:16
поделиться
Другие вопросы по тегам:

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