简体   繁体   English

如何将列表过滤为三个子列表?

[英]How can I filter a list into three sublists?

I have a list called transactions_clean , cleaned up from whitespace etc., look like this:我有一个名为transactions_clean的列表,从空格等中清除,如下所示:

['Edith Mcbride', '$1.21', 'white', '09/15/17', 'Herbert Tran', '$7.29', 'white&blue', '09/15/17', 'Paul Clarke', '$12.52', 'white&blue', '09/15/17', 'Lucille Caldwell', '$5.13', 'white', '09/15/17', 'Eduardo George', '$20.39', 'white&yellow', '09/15/17', 'Danny Mclaughlin', '$30.82', 'purple', '09/15/17', 'Stacy Vargas', '$1.85', 'purple&yellow', '09/15/17', 'Shaun Brock', '$17.98', 'purple&yellow', '09/15/17', 'Erick Harper', '$17.41', 'blue', '09/15/17', 'Michelle Howell', '$28.59', 'blue', '09/15/17', 'Carroll Boyd', '$14.51', 'purple&blue', '09/15/17', 'Teresa Carter', '$19.64', 'white', '09/15/17', 'Jacob Kennedy', '$11.40', 'white&red', '09/15/17', 'Craig Chambers', '$8.79', 'white&blue&red', '09/15/17', 'Peggy Bell', '$8.65', 'blue', '09/15/17', 'Kenneth Cunningham', '$10.53', 'green&blue', '09/15/17', 'Marvin Morgan', '$16.49', 'green&blue&red', '09/15/17', 'Marjorie Russell', '$6.55', 'green&blue&red', '09/15/17', 'Israel Cummings', '$11.86', 'black', '09/15/17', 'June Doyle', '$22.29', 'black&yellow', '09/15/17', 'Jaime Buchanan', '$8.35', 'white&black&yellow', '09/15/17', 'Rhonda Farmer', '$2.91', 'white&black&yellow', '09/15/17', 'Darren Mckenzie', '$22.94', 'green', '09/15/17', 'Rufus Malone', '$4.70', 'green&yellow', '09/15/17', 'Hubert Miles', '$3.59', 'green&yellow&blue', '09/15/17', 'Joseph Bridges', '$5.66', 'green&yellow&purple&blue', '09/15/17', 'Sergio Murphy', '$17.51', 'black', '09/15/17', 'Audrey Ferguson', '$5.54', 'black&blue', '09/15/17', 'Edna Williams', '$17.13', 'black&blue', '09/15/17', 'Randy Fleming', '$21.13', 'black', '09/15/17', 'Elisa Hart', '$0.35', 'black&purple', '09/15/17', 'Ernesto Hunt', '$13.91', 'black&purple', '09/15/17', 'Shannon Chavez', '$19.26', 'yellow', '09/15/17', 'Sammy Cain', '$5.45', 'yellow&red', '09/15/17', 'Steven Reeves', '$5.50', 'yellow', '09/15/17', 'Ruben Jones', '$14.56', 'yellow&blue', '09/15/17', 'Essie Hansen', '$7.33', 'yellow&blue&red', '09/15/17', 'Rene Hardy', '$20.22', 'black', '09/15/17', 'Lucy Snyder', '$8.67', 'black&red', '09/15/17', 'Dallas Obrien', '$8.31', 'black&red', '09/15/17', 'Stacey Payne', '$15.70', 'white&black&red', '09/15/17', 'Tanya Cox', '$6.74', 'yellow', '09/15/17', 'Melody Moran', '$30.84', 'yellow&black', '09/15/17', 'Louise Becker', '$12.31', 'green&yellow&black', '09/15/17', 'Ryan Webster', '$2.94', 'yellow', '09/15/17', 'Justin Blake', '$22.46', 'white&yellow', '09/15/17', 'Beverly Baldwin', '$6.60', 'white&yellow&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', 'white&black', '09/15/17', 'Angelica Garza', '$11.60', 'white&black', '09/15/17', 'Jamie Welch', '$25.27', 'white&black&red', '09/15/17', 'Rex Hudson', '$8.26', 'purple', '09/15/17', 'Nadine Gibbs', '$30.80', 'purple&yellow', '09/15/17', 'Hannah Pratt', '$22.61', 'purple&yellow', '09/15/17', 'Gayle Richards', '$22.19', 'green&purple&yellow', '09/15/17', 'Stanley Holland', '$7.47', 'red', '09/15/17', 'Anna Dean', '$5.49', 'yellow&red', '09/15/17', 'Terrance Saunders', '$23.70', 'green&yellow&red', '09/15/17', 'Brandi Zimmerman', '$26.66', 'red', '09/15/17', 'Guadalupe Freeman', '$25.95', 'green&red', '09/15/17', 'Irving Patterson', '$19.55', 'green&white&red', '09/15/17', 'Karl Ross', '$15.68', 'white', '09/15/17', 'Brandy Cortez', '$23.57', 'white&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', 'white&red', '09/15/17', 'Beatrice Newman', '$22.45', 'white&purple&red', '09/15/17', 'Andre Norris', '$28.46', 'red', '09/15/17', 'Albert Lewis', '$23.89', 'black&red', '09/15/17', 'Javier Bailey', '$24.49', 'black&red', '09/15/17', 'Everett Lyons', '$1.81', 'black&red', '09/15/17', 'Abraham Maxwell', '$6.81', 'green', '09/15/17', 'Traci Craig', '$0.65', 'green&yellow', '09/15/17', 'Jeffrey Jenkins', '$26.45', 'green&yellow&blue', '09/15/17', 'Merle Wilson', '$7.69', 'purple', '09/15/17', 'Janis Franklin', '$8.74', 'purple&black', '09/15/17', 'Leonard Guerrero', '$1.86', 'yellow', '09/15/17', 'Lana Sanchez', '$14.75', 'yellow', '09/15/17', 'Donna Ball', '$28.10', 'yellow&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', 'white&blue', '09/15/17', 'Rogelio Gonzalez', '$9.51', 'white&black&blue', '09/15/17', 'Lora Hammond', '$20.56', 'green', '09/15/17', 'Owen Ward', '$21.64', 'green&yellow', '09/15/17', 'Malcolm Morales', '$24.99', 'green&yellow&black', '09/15/17', 'Eric Mcdaniel', '$29.70', 'green', '09/15/17', 'Madeline Estrada', '$15.52', 'green', '09/15/17', 'Leticia Manning', '$15.70', 'green&purple', '09/15/17', 'Mario Wallace', '$12.36', 'green', '09/15/17', 'Lewis Glover', '$13.66', 'green&white', '09/15/17', 'Gail Phelps', '$30.52', 'green&white&blue', '09/15/17', 'Myrtle Morris', '$22.66', 'green&white&blue', '09/15/17']

These are transactions: name, cost, product, date.这些是交易:名称、成本、产品、日期。 My job is to create three list (customer, sales, thread_sold (that's the color)) and filter the given list into these three.我的工作是创建三个列表(客户、销售、thread_sold(即颜色))并将给定的列表过滤到这三个列表中。 So the names only to the customer's list, the cost only into the sales's list and the product into the thread_sold's list.所以名称只到客户的列表中,成本只到销售的列表中,产品到 thread_sold 的列表中。 I don't need the date.我不需要日期。

I made a code like this:我做了这样的代码:

customers = []
sales = []
thread_sold = []


for item in transactions_clean:
  customers.append(item[0])
  sales.append(item[1])
  thread_sold.append(item[2])

print(sales)

I thought indexing the items in order would help, but it didn't work out.我认为按顺序索引项目会有所帮助,但没有成功。 Also I don't know how to skip the dates.我也不知道如何跳过日期。

You can solve your problem with one line of code:你可以用一行代码解决你的问题:

customers, sales, thread_sold = [transactions_clean[i::4] for i in range(3)]

The list comprehension creates a list with three elements;列表推导式创建一个包含三个元素的列表; each element is a list created from transactions_clean , starting at the i-th element and taking only an element every 4. In this way, when i=0 you get only the names, with i=1 only the prices and with i=2 only the colors.每个元素都是从transactions_clean创建的列表,从第 i 个元素开始,每 4 个元素只取一个元素。这样,当i=0时,您只得到名称, i=1只得到价格, i=2只有 colors。

Then the list created by the list comprehension is unpacked into the three required lists.然后列表推导式创建的列表被解压缩到三个必需的列表中。

You can use slices for that, assuming the order in the list is consistent.您可以为此使用切片,假设列表中的顺序是一致的。 Slices work like this: from:to:step_size切片的工作方式如下: 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]

Just saw Mr. T's comment, you can leave out the end_idx:刚看到T先生的评论,可以省略end_idx:

customers = transactions_clean[0::4]
sales = transactions_clean[1::4]
thread_sold = transactions_clean[2::4]

When you iterate over your list by for item in transactions_clean: you get items for each list, so indexing them like item[1] would just give you string characters.当您通过for item in transactions_clean:遍历您的列表时,您将获得每个列表的项目,因此像item[1]那样对它们进行索引只会给您字符串字符。 If the order is always like customer -> sale -> thread_sold, you can do something like this:如果订单总是像 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])
    

Modifying your code:修改您的代码:


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)

This should generate your desired lists!这应该会生成您想要的列表!

The simplest option I see is to use the list index and iterate with the step parameter of the range iterator to get the items 4 by 4:我看到的最简单的选项是使用列表索引并使用range迭代器的step参数进行迭代以获取 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])

Here, 4 is the step , so values of i will go: 0, 4, 8...这里, 4step ,所以i的值将 go: 0, 4, 8...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM