![]() ![]() |
Aug 19 2006, 12:13 AM
Post
#1
|
|
|
Group: Members Posts: 1,213 Joined: 9-June 05 From: Gobi Desert, Mongolia Member No.: 7,306 |
I have this so far:
CODE for item in dupes[]: mydupeitem=item for item in filter[]: if mydupeitem[2:] = item: pass else write......etc. now is there anything wrong with this? it wipes out my entire bash history, so it never gets to the write statement. filter[] is just a list of filters(strings) and dupes[] is just a list of strings as well, basically i an 'cleaning' my bash history at logoff, I have a remove duplicates script running and it sorts but I would like to remove any "cd blahblah" and rm's mv's etc. any ideas, I am new to python, so any help would be great. |
|
|
|
Aug 19 2006, 01:45 PM
Post
#2
|
|
|
Group: Members Posts: 385 Joined: 3-December 03 Member No.: 1,038 |
Instead of
CODE for item in dupes[]: mydupeitem=item I would use something like CODE for mydupeitem in dupes[]: I centainly think that using the same variable name, item, in both nested loops doesn't seem a good idea and could cause an undesired side effect. HTH |
|
|
|
Aug 19 2006, 05:32 PM
Post
#3
|
|
|
Group: Members Posts: 1,213 Joined: 9-June 05 From: Gobi Desert, Mongolia Member No.: 7,306 |
I agree, I thought "item" was one of the collections constants, such as in vb with "for each vbtextbox in form" i know the wrong syntax but you get the idea.
|
|
|
|
Aug 19 2006, 06:14 PM
Post
#4
|
|
![]() Group: Members Posts: 329 Joined: 1-July 04 Member No.: 3,880 |
QUOTE(bam @ Aug 19 2006, 03:13 AM) I have this so far: CODE for item in dupes[]: mydupeitem=item for item in filter[]: if mydupeitem[2:] = item: pass else write......etc. A few observations: * Your "if mydupeitem..." line is using an assignment (=) instead of a compare (==). * You're reusing your loop variable (item) in the inner loop. I'm not sure Python cares (I'm in the habit of not trying such things), but in other languages like C that would cause much breakage. Note: "item" is just a variable that gets set on each loop iteration. You can use any variable name there that you wish. * I don't understand the empty [] brackets on the "for item ..." lines. They should cause syntax errors. A more elegant solution (assuming you're using a recent version of Python would be something like: CODE def f(x): for item in filter: if x[2:] = item: return false return true filtered_list = filter(f, dupes) That will run f(x) on every element in dupes and set filtered_list equal to the list of those for which f(x) returned true (i.e. they did not match any items in the filter list). |
|
|
|
Aug 19 2006, 08:35 PM
Post
#5
|
|
|
Group: Members Posts: 1,213 Joined: 9-June 05 From: Gobi Desert, Mongolia Member No.: 7,306 |
morning,
yea there was some issues, got it all solved, though not quite as nice as yours. I am new to c-style programming, mostly I diddle with visual basic(for my company work). I saw that python had a nice gui to play with pyQt so this "seemed" closest to vb, so I thought the learning curve would be a little more flat, but guess not. I will however need to start writing "functions" and "subs" in order to keep stuff organized and not spagetti code, not only that but reuseability will be nicer. actually here is what I did: CODE filterlist = ["df","cd","mv","cp"] (removed duplicates before filter) for ditem in noDupes: for fitem in filterlist: if ditem[2:] ==fitem: filterfound == bool(True) break if filterfound == False: fileToOutput.write(ditem) filterfound == bool(False) I use this script to clean up my .bash_history file of duplicates and unwanted commands. It executes on exiting console(.bash_logout) |
|
|
|
Aug 20 2006, 04:10 AM
Post
#6
|
|
![]() Group: Members Posts: 329 Joined: 1-July 04 Member No.: 3,880 |
QUOTE(bam @ Aug 19 2006, 11:35 PM) yea there was some issues, got it all solved, though not quite as nice as yours. I am new to c-style programming, mostly I diddle with visual basic(for my company work). I saw that python had a nice gui to play with pyQt so this "seemed" closest to vb, so I thought the learning curve would be a little more flat, but guess not. I will however need to start writing "functions" and "subs" in order to keep stuff organized and not spagetti code, not only that but reuseability will be nicer. Congrats on getting your program working What causes a lot of confusion for new Python programmers is that it offers a number of features borrowed from the world of "functional programming". Things like lists, first-class functions, list comprehensions and built-ins like map() and filter() let you break out of the imperative style when writing Python code. Why would you want to do that? Well, research shows that for many types of problems functional programming techniques result in much smaller programs with far fewer bugs. It makes it possible to work with programs as mathematical expressions rather than cookbook recipes. Ask yourself "where are most of the bugs in my programs?" The answer is usually "loops and state". Note how my example contained neither Now, just as one can write FORTRAN style code in C++, it's possible to write VB style code in Python. But if you really want to improve yourself as a programmer, focus on learning to use the FP features in Python. In the long run, you'll be glad you did |
|
|
|
Aug 20 2006, 08:09 AM
Post
#7
|
|
|
Group: Members Posts: 1,213 Joined: 9-June 05 From: Gobi Desert, Mongolia Member No.: 7,306 |
FP is just, phenominal, actually I like it(about half way through the article now. This dramatiacally simplifies coding.
|
|
|
|
Sep 1 2006, 06:20 PM
Post
#8
|
|
|
Group: Members Posts: 1,213 Joined: 9-June 05 From: Gobi Desert, Mongolia Member No.: 7,306 |
well here is the end result, I think I am getting ahold of it
#!/usr/bin/env python import os import fileinput fileToSearch="/home/zaurus/.bash_history" #filterlist for non-saves, just add as needed filterlist=[ "cd","mv","cp","df","exit"] filteredlist=[] mylist=[] noDupes=[] [mylist.append(line) for line in fileinput.input( fileToSearch )] fileinput.close() [noDupes.append(j) for j in mylist if not noDupes.count(j)] noDupes.sort filteredlist=noDupes os.remove(fileToSearch) fileToOutput = open( fileToSearch, 'w' ) [filteredlist.remove(y) for x in filterlist for y in noDupes if x == y[0:len(x)] ] [fileToOutput.write(item) for item in filteredlist] fileToOutput.close() basically run this under .bash_logout to clean up my bash_history file of duplicates and unwanted commands, eventually I will have it check against "valid" bash commands/executables as well. |
|
|
|
![]() ![]() |
|
Lo-Fi Version | Time is now: 19th June 2013 - 02:42 AM |