This page is devoted to short programs that can perform powerful operations called Python One-Liners.
- Free ''Python One-Liners'' videos & book resources
- Collection of ''One-Liners'' with interactive shell
- Book ''Python One-Liners''
- Interesting Quora Thread ''Python One-Liner''
- Python One-Line X - How to accomplish different tasks in a single line
- Subreddit '''Python One-Liners'''
- Github '''Python One-Liners''' - Share your own one-liners with the community
I visited this page oftentimes and I loved studying the one-liners presented above. Thanks for creating this awesome resource, JAM, and RJW!
Because I learned a lot from studying the one-liners, I thought why not revive the page (after almost ten years since the last change happened)?
After putting a lot of effort into searching the web for inspiration, I created the following ten one-liners. Some of them are more algorithmic (e.g. Quicksort). Some day, I will add a detailed explanation here - but for now, you can read this blog article to find explanations.
1
2 phrase.find(phrase[::-1])
3
4
5 a, b = b, a
6
7
8 sum(stock_prices[::2])
9
10
11 [line.strip() for line in open(filename)]
12
13
14 reduce(lambda x, y: x * y, range(1, n+1))
15
16
17 python -m cProfile foo.py
18
19
20 lambda l: reduce(lambda z, x: z + [y + [x] for y in z], l, [[]])
21
22
23 lambda x: x if x<=1 else fib(x-1) + fib(x-2)
24
25
26 lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]])
27
28
29 reduce( (lambda r,x: r-set(range(x**2,n,x)) if (x in r) else r), range(2,int(n**0.5)), set(range(2,n)))
Say, you want to do the same as the list.index(element) method but return all indices of the element in the list rather than only a single one.
In this one-liner, you’re looking for element 'Alice' in the list lst = [1, 2, 3, 'Alice', 'Alice'] so it even works if the element is not in the list (unlike the list.index() method).
1
2 lst = [1, 2, 3, 'Alice', 'Alice']
3
4
5 indices = [i for i in range(len(lst)) if lst[i]=='Alice']
6
7
8 print(indices)
9
python -c "print unichr(234)"
This script echos "ê"
Print every line from an input file but remove the first two fields.
python -c "import sys;[sys.stdout.write(' '.join(line.split(' ')[2:])) for line in sys.stdin]" < input.txt
import base64, sys; base64.decode(open(sys.argv[1], "rb"), open(sys.argv[2], "wb"))
I came up with this one-liner in response to an article that said it couldn't be done as a one-liner in Python.
What this does is replace the substring "at" by "op" on all lines of all files (in place) under the path specified (here, the current path).
- Caution: Don't run this on your home directory or you're going to get all your text files edited.
import sys,os,re,fileinput;a=[i[2] for i in os.walk('.') if i[2]] [0];[sys.stdout.write(re.sub('at','op',j)) for j in fileinput.input(a,inplace=1)]
Clearer is: import os.path; a=[f for f in os.listdir('.') if not os.path.isdir(f)]
- Function that returns the set of all subsets of its argument
f = lambda x: [[y for j, y in enumerate(set(x)) if (i >> j) & 1] for i in range(2**len(set(x)))]
>>>f([10,9,1,10,9,1,1,1,10,9,7])
[[], [9], [10], [9, 10], [7], [9, 7], [10, 7], [9, 10, 7], [1], [9, 1], [10, 1], [9, 10, 1], [7, 1], [9, 7, 1], [10, 7, 1], [9, 10, 7, 1]]
-RJW
Alternative (shorter, more functional version):
f = lambda l: reduce(lambda z, x: z + [y + [x] for y in z], l, [[]])
Want to know many bytes a terabyte is? If you know further abbreviations, you can extend the list.
import pprint;pprint.pprint(zip(('Byte', 'KByte', 'MByte', 'GByte', 'TByte'), (1 << 10*i for i in range(5))))
And what's the largest number that can be represented by 8 Bytes?
print '\n'.join("%i Byte = %i Bit = largest number: %i" % (j, j*8, 256**j-1) for j in (1 << i for i in range(8)))
Cute, isn't it?
print '\n'.join(line.split(":",1)[0] for line in open("/etc/passwd"))
python -c "import csv,json;print json.dumps(list(csv.reader(open('csv_file.csv'))))"
python -c 'import re,sys;print re.sub("\s*([{};,:])\s*", "\\1", re.sub("/\*.*?\*/", "", re.sub("\s+", " ", sys.stdin.read())))'
python -c "print ''.join(chr(int(''.join(i), 16)) for i in zip(*[iter('474e552773204e6f7420556e6978')]*2))"
python -c "import sys; print sys.stdin.read().replace('\r','').split('\n\n',2)[1]";
print '~/python/one-liners.py'.split('.')[-1]
This can be used to convert a string into a "url safe" string
python -c "import urllib, sys ; print urllib.quote_plus(sys.stdin.read())";
python -c "import sys; print '\n'.join(reversed(sys.stdin.read().split('\n')))"
python -c "import sys; sys.stdout.write(''.join(sys.stdin.readlines()[:10]))" < /path/to/your/file
[another command] | python -c "import sys,re;[sys.stdout.write(re.sub('PATTERN', 'SUBSTITUTION', line)) for line in sys.stdin]"
python -c "import sys; tmp = lambda x: sys.stdout.write(x.split()[0]+'\t'+str(int(x.split()[1])+1)+'\n'); map(tmp, sys.stdin);"
A related issue is embedding Python into a Makefile. I had a really long script that I was trying to cram into a makefile so I automated the process:
1 import sys,re
2
3 def main():
4 fh = open(sys.argv[1],'r')
5 lines = fh.readlines()
6 print '\tpython2.2 -c "`printf \\"if 1:\\n\\'
7 for line in lines:
8 line = re.sub('[\\\'\"()]','\\\g<0>',line)
9
10
11 wh_spc_len = len(re.match('\s*',line).group())
12
13 sys.stdout.write('\t')
14 sys.stdout.write(wh_spc_len/4*'\\t'+line.rstrip().lstrip())
15 sys.stdout.write('\\n\\\n')
16 print '\t\\"`"'
17
18 if __name__=='__main__':
19 main()
This script generates a "one-liner" from make's point of view.
They call it "The Pyed Piper" or pyp. It's pretty similar to the -c way of executing python, but it imports common modules and has its own preset variable that help with splitting/joining, line counter, etc. You use pipes to pass information forward instead of nested parentheses, and then use your normal python string and list methods. Here is an example from the homepage:
Here, we take a Linux long listing, capture every other of the 5th through the 10th lines, keep the username and filename fields, replace "hello" with "goodbye", capitalize the first letter of every word, and then add the text "is splendid" to the end:
ls -l | pyp "pp[5:11:2] | whitespace[2], w[-1] | p.replace('hello','goodbye') | p.title(),'is splendid'"
and the explanation:
This uses pyp's built-in string and list variables (p and pp), as well as the variable whitespace and its shortcut w, which both represent a list based on splitting each line on whitespace (whitespace = w = p.split()). The other functions and selection techniques are all standard Python. Notice the pipes ("|") are inside the pyp command.
http://code.google.com/p/pyp/ http://opensource.imageworks.com/?p=pyp