Dictionaries and loops

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Mon Sep 8 15:46:57 CEST 2008


Mike P a écrit :
> Hi All
> i have a CSV file that i'm reading in and each line has the look of
> the below
> 
> {None: ['User-ID', 'Count']}
> {None: ['576460847178667334', '1']}
> {None: ['576460847178632334', '8']}

This doesn't look like a CSV file at all... Is that what you actually 
have in the file, or what you get from the csv.reader ???

> i want to make a dictionary of items in the form
> {576460847178667334:1, 576460847178632334:8, ..... } for all rows in
> the datafile
> 
> my code so far is thus:
> 
> dict1={}
> j=1
> for row in reader1:
>   if j==1:
>     j+=1
>     continue #thus allowing me to skip the first row
>   if j>1:

Drop this, and call reader1.next() before entering the loop.

>     for element in row.values():
>       for item in element:
>         if int(item)%2==0:
>           dict1[int(item)] = int(item)+1

You're repeating the same operation (building an int from a string) 
three time, where one would be enough:

        for item in element:
          item = int(item)
          if item %2 == 0: # or : if not item % 2:
            dict1[item] = item + 1

But this code is not going to yield the expected result...

> # i know this is the problem line as it's not picking the second item
> up just finding the first and increasing it, but i can't figure out
> how to correct this?

Mmm... What about learning Python instead of trying any random code ? 
Programming by accident won't take you very far, and you can't expect 
this neswgroup to do your own work.


Ok, assuming your CSV file looks like this - and you never have 
duplicate values for the User-id column:

# source.csv
"User-ID", "Count"
576460847178667334, 1
576460847178632334, 8'

Here's a possible solution:

result = {}
src = open("source.csv", "rb")
try:
   reader = csv.reader(src)
   reader.next()
   for row in reader:
       user_id, count = int(row[0]), int(row[1])
       result[user_id] = count
finally:
   src.close()

or more tersely:

src = open("source.csv", "rb")
try:
   reader = csv.reader(src)
   reader.next()
   result = dict(map(int, row) for row in reader)
finally:
   src.close()




More information about the Python-list mailing list