Найти кортеж в списке с тем же первым элементом и вернуть другой список

Я искал для достижения подобной вещи и использовал ответ, предоставленный @Ankur, с небольшими изменениями, поскольку мне нужно было снова скрыть столбцы после экспорта.

Код выглядит следующим образом:

excelExport(e) {
                Spa.startLoading(); // loading overlay to hide the columns showing then hiding again
                var columns = e.sender.columns;
                var hiddenColumnNumbers = [];
                if (!exportFlag) {
                    for (let i = 0; i < columns.length; i++) {
                        if (columns[i].hidden) {
                            e.sender.showColumn(i);
                            hiddenColumnNumbers.push(i);
                        }
                    }
                    e.preventDefault();
                    exportFlag = true;
                    setTimeout(() => {
                        e.sender.saveAsExcel();
                        for (let j = 0; j < columns.length; j++) {
                            if (hiddenColumnNumbers.indexOf(j) > -1) {
                                e.sender.hideColumn(j);
                            }
                        }
                        Spa.stopLoading(); // hide loading overlay
                    });
                } else {
                    for (let k = 0; k < columns.length; k++) {
                        if (columns[k].hidden)
                            e.sender.hideColumn(k);
                    }
                    exportFlag = false;
                    Spa.stopLoading(); // hide loading overlay
                }
            },
1
задан Amir Hossein 30 March 2019 в 23:08
поделиться

2 ответа

Вы не можете редактировать tuples - они являются неизменяемыми. Вы можете использовать lists и затем преобразовать все обратно в tuples:

data = [('a', 'b'), ('a', 'c'),('d','f')]

new_data = []


for d in data                                             # loop over your data
    if new_data and new_data[-1][0] == d[0]:              # if something in new_data and 1st
        new_data[-1].extend(d[1:])                        # ones are identical: extend
    else:
        new_data.append( [a for a in d] )                 # not same/nothing in: add items

print(new_data)                   # all are lists

new_data = [tuple(x) for x in new_data]
print(new_data)                   # all are tuples again      

Вывод:

[['a', 'b', 'c'], ['d', 'f']]     # all are lists
[('a', 'b', 'c'), ('d', 'f')]     # all are tuples again   

См. Неизменяемые и изменяемые типы

0
ответ дан Patrick Artner 30 March 2019 в 23:08
поделиться

Вот один из способов сделать это. Для эффективности мы построим dict с первым значением в качестве ключа. Мы сохраняем значения в том порядке, в котором они отображаются (и кортежи в их первоначальном порядке, если вы используете Python> = 3.7 - в противном случае вам придется использовать collections.OrderedDict)

def join_by_first(sequences):
    out = {}
    for seq in sequences:
        try:
            out[seq[0]].extend(seq[1:])
        except KeyError:
            out[seq[0]] = list(seq)
    return [tuple(values) for values in out.values()]

join_by_first([('a', 'b'), ('a', 'c'),('d','f')])
# [('a', 'b', 'c'), ('d', 'f')]
0
ответ дан Thierry Lathuille 30 March 2019 в 23:08
поделиться
Другие вопросы по тегам:

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