0

I have a string that includes multiple transactions which are separated by various artifacts, like ';,;' and irregular spacing. I manage to separate the string into a list where every element contains the items of one transaction. In the process I include various print() instructions to make sure that I am getting the results I expect. And it seems to be working. However, when I finish cleaning up the list and try to print it, every transaction has been overwritten by the last item of the list. I don't know what is wrong here.

daily_sales = \
"""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"""

#------------------------------------------------
# Start coding below!


daily_sales_replaced = daily_sales.replace(';,;','#')

daily_transactions = daily_sales_replaced.split(',')

#print(daily_transactions)

daily_transactions_split = []

for transaction in daily_transactions:
  daily_transactions_split.append(transaction.split('#'))

#print(daily_transactions_split)

clean_transactions = []
temp_transaction = [''] * 4

for transaction in daily_transactions_split:
  for item in range(4):
    temp_transaction[item] = transaction[item].strip()
  clean_transactions.append(temp_transaction)
  print(clean_transactions[-1])

print(clean_transactions)
martineau
  • 119,623
  • 25
  • 170
  • 301

2 Answers2

1

Every variable in Python is a reference to an object, so when you add temp_transaction to clean_transactions, you are not adding a copy of temp_transaction, but a reference to the same list that you created before the loop, and that you are changing in place every time. That is why clean_transactions in the end contains only the last item: it contains several references to the same list. Change your loop to this, to create a new list every time:

clean_transactions = [] 

for transaction in daily_transactions_split:
  temp_transaction = [''] * 4  # Create a new version of temp_transation
  for item in range(4):
    temp_transaction[item] = transaction[item].strip()
  clean_transactions.append(temp_transaction)
  print(clean_transactions[-1])

If you want to improve your code (in terms of making it more "pythonic"), you can use a list comprehension:

clean_transactions = [] 
for transaction in daily_transactions_split:
  clean_transactions.append([transaction[i].strip() for i in range(4)])
nonDucor
  • 2,057
  • 12
  • 17
  • This works! However, is EVERYTHING a pointer? Even variables? And if this is the case, would initialising everything withing the scope I am using it get rid of similar problems in the future? – Some_Software_Dude Jul 20 '22 at 14:04
  • "Everything in Python is a pointer" - What do you mean? – funnydman Jul 20 '22 at 14:07
  • @Some_Software_Dude, with the exception of numbers, strings (which are immutable), every time you create an object in Python, what you get is a reference to that object (i.e. they are shared). A variable "points" to the object (or references it). So, if you do: `a = [1,2,3]; b = a; b[1] = 7; print(a)` you'll get `[1, 7, 3]`, as both variables "point" to the same object. Have a look at [this](https://stackoverflow.com/questions/8184244/i-thought-python-passed-everything-by-reference) answer. – nonDucor Jul 20 '22 at 14:12
  • @funnydman, I corrected the usage of "pointer" to "reference" in the original answer, to make it more clear. – nonDucor Jul 20 '22 at 14:14
  • 1
    You _still_ get a reference to the object with strings and numbers and other immutable objects. The difference is that you can't modify those objects in-place, and attempting to do so will return a _new_ object that contains the result of the operation – Pranav Hosangadi Jul 20 '22 at 14:16
  • `Every variable in Python is a reference to an object`, without exception, numbers and strings are the same. – Mechanic Pig Jul 20 '22 at 14:16
  • I corrected the answer. – nonDucor Jul 20 '22 at 14:18
0

As @nonDucor mentioned in their answer - you need to add deep copies of temp_transaction instead of shallow ones (references).

Instead of initializing temp_transaction inside the loop, you can also keep it as it is, but add a deep copy of temp_transaction to your list instead:

from copy import deepcopy
...
for transaction in daily_transactions_split:
  for item in range(4):
    temp_transaction[item] = transaction[item].strip()
  clean_transactions.append(deepcopy(temp_transaction)) # deep copy here

see also How to deep copy a list?

Frank Schmitt
  • 30,195
  • 12
  • 73
  • 107
  • Is there any advantage to using deepcopy in this context? – nonDucor Jul 20 '22 at 14:09
  • @nonDucor Not really. In other cases, it might be preferable to initialize the "master" object only once (esp if initializing requires some expensive operations, e.g. a network call). – Frank Schmitt Jul 21 '22 at 07:33