#python #list #tuples
#python #Список #кортежи
Вопрос:
У меня есть два разных списка кортежей с разной структурой, которые я хочу добавить. Первый, attribute
— это список кортежей с каждым значением в одном кортеже в виде строки и всегда с запятой после значения, вот так
[('id',), ('attr_1',), ('attr_2',), ...]
Второй, value
— это список кортежей, в котором все значения, соответствующие атрибутам, находятся в одном кортеже и заполнены строками и числами, вот так
[(111, 222, 333), ('aaa', 'bbb', 'ccc'), ('a1', 'b2', 'c3'), ...]
Я хочу связать оба объекта, в результате чего файл будет выводиться следующим образом
id; attr_1; attr_2; ...
111; aaa; a1; ...
222; bbb; b2; ...
333; ccc; c3; ...
Я пытался до сих пор
attr = (list(sum(attribute, ())) )
attri = ";".join(attr)
который отлично работает для attribute
списка, но не для value
. Есть идеи? Спасибо
Ответ №1:
Используя zip
:
test_tup = [(111, 222, 333), ('aaa', 'bbb', 'ccc'), ('a1', 'b2', 'c3')]
print(list(zip(*test_tup)))
ВЫВОД:
[(111, 'aaa', 'a1'), (222, 'bbb', 'b2'), (333, 'ccc', 'c3')]
Записать их вместе, разделенные ;
:
print('; '.join(' '.join(str(x) for x in i) for i in headers))
print('n'.join('; '.join(str(x) for x in i) for i in res))
ВЫВОД:
id; attr_1; attr_2
111; aaa; a1
222; bbb; b2
333; ccc; c3
Ответ №2:
Попробуйте это, если вы хотите записать желаемый результат в файл csv:
import pandas as pd
a = [('id',), ('attr_1',), ('attr_2',), ...]
b = [(111, 222, 333), ('aaa', 'bbb', 'ccc'), ('a1', 'b2', 'c3'), ...]
df = pd.DataFrame({a[i][0] : b[i] for i in range(len(a))}) # length of a and each item inside b must be same
df.to_csv(file_name, sep=';')
Комментарии:
1. Есть ли какие-либо преимущества в производительности, гарантирующие использование pandas по сравнению с собственными функциями python?
2. @DillonDavis Другой человек запросил, в результате чего выводится файл . Поскольку более целесообразно сохранить результат в формате, подобном csv, я использовал pandas dataframe.
Ответ №3:
Вы могли бы сделать что-то вроде,
>>> header
[('id',), ('attr_1',), ('attr_2',)]
>>> x
[(111, 222, 333), ('aaa', 'bbb', 'ccc'), ('a1', 'b2', 'c3')]
>>> ';'.join(x[0] for x in header)
'id;attr_1;attr_2'
>>> print('n'.join(';'.join(str(_) for _ in y) for y in zip(*x)))
111;aaa;a1
222;bbb;b2
333;ccc;c3
Ответ №4:
Вы не можете .join
int
сначала преобразовать их в str
s, а затем использовать zip
:
values = [(111, 222, 333), ('aaa', 'bbb', 'ccc'), ('a1', 'b2', 'c3')]
values = [tuple(str(j) for j in i) for i in values]
out = ['; '.join(i) for i in zip(*values)]
print(out) #['111; aaa; a1', '222; bbb; b2', '333; ccc; c3']
При желании добавьте out = 'n'.join(out)
строку после out = ['; '.join(i) for i in zip(*values)]
, если хотите single str
.
Ответ №5:
Вы можете выполнить объединение также во втором списке, но вам нужно сделать это для каждого элемента списка. F.пример по составлению списка:
value_list = [ ";".join(i) for i in value]