#python #list
#python #Список
Вопрос:
У меня есть список с именем transactions_clean, очищенный от пробелов и т. Д., Выглядит так:
['Edith Mcbride', '$1.21', 'white', '09/15/17', 'Herbert Tran', '$7.29', 'whiteamp;blue', '09/15/17', 'Paul Clarke', '$12.52', 'whiteamp;blue', '09/15/17', 'Lucille Caldwell', '$5.13', 'white', '09/15/17', 'Eduardo George', '$20.39', 'whiteamp;yellow', '09/15/17', 'Danny Mclaughlin', '$30.82', 'purple', '09/15/17', 'Stacy Vargas', '$1.85', 'purpleamp;yellow', '09/15/17', 'Shaun Brock', '$17.98', 'purpleamp;yellow', '09/15/17', 'Erick Harper', '$17.41', 'blue', '09/15/17', 'Michelle Howell', '$28.59', 'blue', '09/15/17', 'Carroll Boyd', '$14.51', 'purpleamp;blue', '09/15/17', 'Teresa Carter', '$19.64', 'white', '09/15/17', 'Jacob Kennedy', '$11.40', 'whiteamp;red', '09/15/17', 'Craig Chambers', '$8.79', 'whiteamp;blueamp;red', '09/15/17', 'Peggy Bell', '$8.65', 'blue', '09/15/17', 'Kenneth Cunningham', '$10.53', 'greenamp;blue', '09/15/17', 'Marvin Morgan', '$16.49', 'greenamp;blueamp;red', '09/15/17', 'Marjorie Russell', '$6.55', 'greenamp;blueamp;red', '09/15/17', 'Israel Cummings', '$11.86', 'black', '09/15/17', 'June Doyle', '$22.29', 'blackamp;yellow', '09/15/17', 'Jaime Buchanan', '$8.35', 'whiteamp;blackamp;yellow', '09/15/17', 'Rhonda Farmer', '$2.91', 'whiteamp;blackamp;yellow', '09/15/17', 'Darren Mckenzie', '$22.94', 'green', '09/15/17', 'Rufus Malone', '$4.70', 'greenamp;yellow', '09/15/17', 'Hubert Miles', '$3.59', 'greenamp;yellowamp;blue', '09/15/17', 'Joseph Bridges', '$5.66', 'greenamp;yellowamp;purpleamp;blue', '09/15/17', 'Sergio Murphy', '$17.51', 'black', '09/15/17', 'Audrey Ferguson', '$5.54', 'blackamp;blue', '09/15/17', 'Edna Williams', '$17.13', 'blackamp;blue', '09/15/17', 'Randy Fleming', '$21.13', 'black', '09/15/17', 'Elisa Hart', '$0.35', 'blackamp;purple', '09/15/17', 'Ernesto Hunt', '$13.91', 'blackamp;purple', '09/15/17', 'Shannon Chavez', '$19.26', 'yellow', '09/15/17', 'Sammy Cain', '$5.45', 'yellowamp;red', '09/15/17', 'Steven Reeves', '$5.50', 'yellow', '09/15/17', 'Ruben Jones', '$14.56', 'yellowamp;blue', '09/15/17', 'Essie Hansen', '$7.33', 'yellowamp;blueamp;red', '09/15/17', 'Rene Hardy', '$20.22', 'black', '09/15/17', 'Lucy Snyder', '$8.67', 'blackamp;red', '09/15/17', 'Dallas Obrien', '$8.31', 'blackamp;red', '09/15/17', 'Stacey Payne', '$15.70', 'whiteamp;blackamp;red', '09/15/17', 'Tanya Cox', '$6.74', 'yellow', '09/15/17', 'Melody Moran', '$30.84', 'yellowamp;black', '09/15/17', 'Louise Becker', '$12.31', 'greenamp;yellowamp;black', '09/15/17', 'Ryan Webster', '$2.94', 'yellow', '09/15/17', 'Justin Blake', '$22.46', 'whiteamp;yellow', '09/15/17', 'Beverly Baldwin', '$6.60', 'whiteamp;yellowamp;black', '09/15/17', 'Dale Brady', '$6.27', 'yellow', '09/15/17', 'Guadalupe Potter', '$21.12', 'yellow', '09/15/17', 'Desiree Butler', '$2.10', 'white', '09/15/17', 'Sonja Barnett', '$14.22', 'whiteamp;black', '09/15/17', 'Angelica Garza', '$11.60', 'whiteamp;black', '09/15/17', 'Jamie Welch', '$25.27', 'whiteamp;blackamp;red', '09/15/17', 'Rex Hudson', '$8.26', 'purple', '09/15/17', 'Nadine Gibbs', '$30.80', 'purpleamp;yellow', '09/15/17', 'Hannah Pratt', '$22.61', 'purpleamp;yellow', '09/15/17', 'Gayle Richards', '$22.19', 'greenamp;purpleamp;yellow', '09/15/17', 'Stanley Holland', '$7.47', 'red', '09/15/17', 'Anna Dean', '$5.49', 'yellowamp;red', '09/15/17', 'Terrance Saunders', '$23.70', 'greenamp;yellowamp;red', '09/15/17', 'Brandi Zimmerman', '$26.66', 'red', '09/15/17', 'Guadalupe Freeman', '$25.95', 'greenamp;red', '09/15/17', 'Irving Patterson', '$19.55', 'greenamp;whiteamp;red', '09/15/17', 'Karl Ross', '$15.68', 'white', '09/15/17', 'Brandy Cortez', '$23.57', 'whiteamp;red', '09/15/17', 'Mamie Riley', '$29.32', 'purple', '09/15/17', 'Mike Thornton', '$26.44', 'purple', '09/15/17', 'Jamie Vaughn', '$17.24', 'green', '09/15/17', 'Noah Day', '$8.49', 'green', '09/15/17', 'Josephine Keller', '$13.10', 'green', '09/15/17', 'Tracey Wolfe', '$20.39', 'red', '09/15/17', 'Ignacio Parks', '$14.70', 'whiteamp;red', '09/15/17', 'Beatrice Newman', '$22.45', 'whiteamp;purpleamp;red', '09/15/17', 'Andre Norris', '$28.46', 'red', '09/15/17', 'Albert Lewis', '$23.89', 'blackamp;red', '09/15/17', 'Javier Bailey', '$24.49', 'blackamp;red', '09/15/17', 'Everett Lyons', '$1.81', 'blackamp;red', '09/15/17', 'Abraham Maxwell', '$6.81', 'green', '09/15/17', 'Traci Craig', '$0.65', 'greenamp;yellow', '09/15/17', 'Jeffrey Jenkins', '$26.45', 'greenamp;yellowamp;blue', '09/15/17', 'Merle Wilson', '$7.69', 'purple', '09/15/17', 'Janis Franklin', '$8.74', 'purpleamp;black', '09/15/17', 'Leonard Guerrero', '$1.86', 'yellow', '09/15/17', 'Lana Sanchez', '$14.75', 'yellow', '09/15/17', 'Donna Ball', '$28.10', 'yellowamp;blue', '09/15/17', 'Terrell Barber', '$9.91', 'green', '09/15/17', 'Jody Flores', '$16.34', 'green', '09/15/17', 'Daryl Herrera', '$27.57', 'white', '09/15/17', 'Miguel Mcguire', '$5.25', 'whiteamp;blue', '09/15/17', 'Rogelio Gonzalez', '$9.51', 'whiteamp;blackamp;blue', '09/15/17', 'Lora Hammond', '$20.56', 'green', '09/15/17', 'Owen Ward', '$21.64', 'greenamp;yellow', '09/15/17', 'Malcolm Morales', '$24.99', 'greenamp;yellowamp;black', '09/15/17', 'Eric Mcdaniel', '$29.70', 'green', '09/15/17', 'Madeline Estrada', '$15.52', 'green', '09/15/17', 'Leticia Manning', '$15.70', 'greenamp;purple', '09/15/17', 'Mario Wallace', '$12.36', 'green', '09/15/17', 'Lewis Glover', '$13.66', 'greenamp;white', '09/15/17', 'Gail Phelps', '$30.52', 'greenamp;whiteamp;blue', '09/15/17', 'Myrtle Morris', '$22.66', 'greenamp;whiteamp;blue', '09/15/17']
Это транзакции: имя, стоимость, продукт, дата. Моя задача — создать три списка (customer, sales, thread_sold (это цвет)) и отфильтровать данный список по этим трем. Таким образом, имена только в списке клиентов, стоимость только в списке продаж, а продукт — в списке thread_sold. Мне не нужна дата.
Я создал такой код:
customers = []
sales = []
thread_sold = []
for item in transactions_clean:
customers.append(item[0])
sales.append(item[1])
thread_sold.append(item[2])
print(sales)
Я думал, что индексирование элементов по порядку поможет, но это не сработало. Также я не знаю, как пропустить даты.
Комментарии:
1.Как насчет
customers = l[0::4]
sales = l[1::4]
andthread_sold = l[2::4]
?
Ответ №1:
Вы можете решить свою проблему с помощью одной строки кода:
customers, sales, thread_sold = [transactions_clean[i::4] for i in range(3)]
Понимание списка создает список с тремя элементами; каждый элемент представляет собой список, созданный из transactions_clean
, начиная с i-го элемента и принимая только элемент каждые 4. Таким образом, когда i=0
вы получаете только имена, i=1
только цены и i=2
только цвета.
Затем список, созданный с помощью понимания списка, распаковывается в три обязательных списка.
Комментарии:
1. Спасибо, можете немного объяснить, как работает это понимание списка?
2.
range(3)
сгенерирует0
,1
и2
. для каждого значенияtransactions_clean[i::4]
будет начинаться с значенияi
th и проходить по списку с шагом 4; Таким образом, для имен он будет переходить от имени в позиции 0 к следующему имени в позиции 4 списка. Цикл гарантирует, что у вас есть три списка, каждый из которых начинается со значений, показанных выше.3. @NTFS я обновил ответ. @anurag
range(3)
генерирует0, 1, 2
.4. @PieCot мой плохой!
Ответ №2:
Для этого можно использовать срезы, предполагая, что порядок в списке согласован. Фрагменты работают следующим образом: from:to:step_size
end_idx = len(transactions_clean)
customers = transactions_clean[0:end_idx:4]
sales = transactions_clean[1:end_idx:4]
thread_sold = transactions_clean[2:end_idx:4]
Только что увидел комментарий мистера Т., вы можете не указывать end_idx:
customers = transactions_clean[0::4]
sales = transactions_clean[1::4]
thread_sold = transactions_clean[2::4]
Комментарии:
1. Отличное решение 🙂
2. Я имею в виду … да, в конце концов, это твое 😉
Ответ №3:
Когда вы перебираете свой список, for item in transactions_clean:
вы получаете элементы для каждого списка, поэтому индексирование их как item[1]
просто даст вам строковые символы. Если заказ всегда похож на customer -> sale -> thread_sold, вы можете сделать что-то вроде этого:
customers = []
sales = []
thread_sold = []
for i in range(len(transactions_clean) // 3):
customers.append(transactions_clean[i])
sales.append(transactions_clean[i 1])
thread_sold.append(transactions_clean[i 2])
Ответ №4:
Изменение вашего кода:
customers = []
sales = []
thread_sold = []
for i, item in enumerate(transactions_clean):
if i % 4 == 0:
customers.append(item)
elif i % 4 == 1:
sales.append(item)
elif i % 4 == 2:
thread_sold.append(item)
else:
continue
print(sales)
Это должно генерировать нужные вам списки!
Комментарии:
1. Спасибо, что означает enumerate?
2. @NFT enumerate вид генерирует количество элементов в списке; количество переходит в переменную
i
, а фактический элемент переходит вitem
!
Ответ №5:
Самый простой вариант, который я вижу, — использовать индекс списка и выполнить итерацию с step
параметром range
итератора, чтобы получить элементы 4 на 4:
for i in range(0, len(transactions_clean), 4):
customers.append(transactions_clean[i])
sales.append(transactions_clean[i 1])
thread_sold.append(transactions_clean[i 2])
Здесь 4
, step
так что значения i
будут: 0, 4, 8…