From: nospam@example.net   
      
   On Mon, 19 Aug 2024, Stefan Ram wrote:   
      
   > Richard Kettlewell wrote or quoted:   
   >> Yes, you could do a direct translation from the Awk and end up with   
   >> something that looked quite similar, apart from the differences in   
   >> syntax.   
   >   
   > Trying to make that Python script more user-friendly for folks   
   > who dig awk, then rolling out a sleeker version . . .   
      
   Looks pretty neat and understandable to me. =)   
      
   > #!/usr/bin/env python3   
   >   
   > import sys   
   > import csv   
   >   
   > # Initialize variables   
   > total_price = 0   
   > min_year = 0   
   > max_year = 0   
   > author_count = {}   
   > year_count = {}   
   >   
   > # Print the header of the report   
   > print("Book Analysis Report")   
   > print("====================")   
   >   
   > # Read CSV data from standard input   
   > reader = csv.reader(sys.stdin)   
   > next(reader) # Skip the header row   
   >   
   > # Process each row in the CSV   
   > for row in reader:   
   > title, author, year, price = row   
   > year = int(year)   
   > price = float(price)   
   >   
   > # Accumulate total price   
   > total_price += price   
   >   
   > # Determine min and max year   
   > if min_year == 0 or year < min_year:   
   > min_year = year   
   > if year > max_year:   
   > max_year = year   
   >   
   > # Count books per author   
   > if author in author_count:   
   > author_count[author] += 1   
   > else:   
   > author_count[author] = 1   
   >   
   > # Count books per year   
   > if year in year_count:   
   > year_count[year] += 1   
   > else:   
   > year_count[year] = 1   
   >   
   > # Calculate total number of books   
   > total_books = sum(author_count.values())   
   >   
   > # Print the report   
   > print("\nTotal number of books:", total_books)   
   > print("Average book price: $%.2f" % (total_price / total_books))   
   > print("Year range:", min_year, "to", max_year)   
   >   
   > print("\nBooks per author:")   
   > for author, count in author_count.items():   
   > print(author + ":", count)   
   >   
   > print("\nBooks per year:")   
   > for year, count in year_count.items():   
   > print(str(year) + ":", count)   
   >   
   > No need to make it such a big production, though . . .   
   >   
   > import csv, sys   
   > from collections import Counter   
   >   
   > with open(sys.argv[1]) as f:   
   > data = list(csv.reader(f))[1:]   
   > prices = [float(row[3]) for row in data]   
   > years = [int(row[2]) for row in data]   
   > authors = [row[1] for row in data]   
   >   
   > print("Book Analysis Report\n====================")   
   > print(f"\nTotal number of books: {len(data)}")   
   > print(f"Average book price: ${sum(prices) / len(prices):.2f}")   
   > print(f"Year range: {min(years)} to {max(years)}")   
   >   
   > print("\nBooks per author:")   
   > for author, count in Counter(authors).items():   
   > print(f"{author}: {count}")   
   >   
   > print("\nBooks per year:")   
   > for year, count in Counter(years).items():   
   > print(f"{year}: {count}")   
   >   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|