Як спрасціць апрацоўку спісу ў Python?

Вось мая першая праграма на Python, маленькая прылада, якая пераўтворыць з васьмярковай кода Unix для правоў доступу да файлаў у сімвалічнай форме:

s=raw_input("Octal?  ");
digits=[int(s[0]),int(s[1]),int(s[2])];
lookup=['','x','w','wx','r','rx','rw','rwx'];
uout='u='+lookup[digits[0]];
gout='g='+lookup[digits[1]];
oout='o='+lookup[digits[2]];
print(uout+','+gout+','+oout);

Ці існуюць спосабы, каб скараціць гэты код, скарыстацца нейкім «апрацоўкай спісаў»? Напрыклад, каб прымяніць Int функцыя адразу для ўсіх трох знакаў S без неабходнасці рабіць відавочнае індэксаванне. А індэкс ў перакадыроўкі , выкарыстоўваючы ўвесь спіс лічбы адразу?

3
Вы наўмысна жадаючы выкарыстоўваць , у канцы кожнага радка ў гэтым сцэнары? Гэта <�я> Python , ўсё ж такі ... :)
дададзена аўтар summea, крыніца
Цалкам для забавы (не выкарыстоўвайце гэта), вось адзін ўкладыш :. <�Код> друк ( «" далучыцца (з + "=" + "XW г" "далучыцца да (.» [Я-1: я і б] для я ў (4,2,1)) для C, B ў паштовую індэкс ( 'Ugo', карта (міжнар, raw_input ( "васьмярковы?")))))
дададзена аўтар Andrew Clark, крыніца

8 адказы

digits=[int(s[0]),int(s[1]),int(s[2])];

можна запісаць у выглядзе:

digits = map(int,s)

альбо:

digits = [ int(x) for x in s ]  #list comprehension

Як гэта выглядае, як вы маглі б выкарыстоўваць python3.x (ці плануеце выкарыстоўваць яго ў будучыні на аснове вашай функцыі, як выкарыстанне друку), вы можаце выбраць для спісу-разумення, калі вы не хочаце, каб вырыць ў далейшым і выкарыстоўваць < код> зашпілька-маланка , як паказана на адным з наступных адказаў.

11
дададзена
OP, выкарыстоўваючы raw_input , так што 2.X
дададзена аўтар Blender, крыніца
@Blender - Добры пытанне. Я не заўважыў, што (я толькі што бачыў функцыю, як аператар друку).
дададзена аўтар mgilson, крыніца
+1 для выкарыстання як карту і спіс разуменне
дададзена аўтар Andy, крыніца
Aha! <�Код> Карта быў менавіта такога роду функцыі я шукаў, нешта я прывык выкарыстоўваць у <�я> Mathematica і J .
дададзена аўтар murray, крыніца
@Blender: Я ўсё яшчэ спатыкаючыся вакол трохі тут, і відавочнае чытанне ўводу было падчас тэставання маёй праграмы ў інтэрактыўным рэжыме (у Spyder). Што я буду рабіць гэта зрабіць гэта выкананы скрыпт, і для гэтага я буду выкарыстоўваць sys.argv [1] , каб атрымаць ўваход непасрэдна з каманднага радка, а не запытваючы і чытанне ўваходных дадзеных.
дададзена аўтар murray, крыніца

Вось крыху аптымізаваная версія кода:

s = raw_input("Octal?  ")
digits = map(int, s)
lookup = ['','x','w','wx','r','rx','rw','rwx']
perms = [lookup[d] for d in digits]
rights = ['{}={}'.format(*x) for x in zip('ugo', perms)]
print ','.join(rights)
5
дададзена
@murray На жаль, ён павінен быць правы , а не перманент .
дададзена аўтар Lev Levitsky, крыніца
На жаль: Я не бачыць «і =» і г.д., часткі, калі я запускаю гэты код у інтэрактыўным рэжыме з выкарыстаннем Python 2.7. І тое ж самае, калі я выканаць яго як сцэнар пад Python 3.3, замяніўшы raw_input радок з кодам <> імпарт SYS , а затым s = sys.argv [1] , а апошняя радок з кодам <> друку ( ''. далучыцца (рассыпалася)) .
дададзена аўтар murray, крыніца
Гэта проста навучыў мяне больш пра Python, чым у цэлым шмат пошуку вакол праз дакументы. (І, вядома, я нецярплівы дастаткова не жадаючы прайсці праз тыповыя стомных уступныя падручнікі, якія я бачыў.)
дададзена аўтар murray, крыніца

Вось крыху аптымізаваная версія кода:

s = raw_input("Octal?  ")
digits = map(int, s)
lookup = ['','x','w','wx','r','rx','rw','rwx']
perms = [lookup[d] for d in digits]
rights = ['{}={}'.format(*x) for x in zip('ugo', perms)]
print ','.join(rights)
5
дададзена
@murray На жаль, ён павінен быць правы , а не перманент .
дададзена аўтар Lev Levitsky, крыніца
На жаль: Я не бачыць «і =» і г.д., часткі, калі я запускаю гэты код у інтэрактыўным рэжыме з выкарыстаннем Python 2.7. І тое ж самае, калі я выканаць яго як сцэнар пад Python 3.3, замяніўшы raw_input радок з кодам <> імпарт SYS , а затым s = sys.argv [1] , а апошняя радок з кодам <> друку ( ''. далучыцца (рассыпалася)) .
дададзена аўтар murray, крыніца
Гэта проста навучыў мяне больш пра Python, чым у цэлым шмат пошуку вакол праз дакументы. (І, вядома, я нецярплівы дастаткова не жадаючы прайсці праз тыповыя стомных уступныя падручнікі, якія я бачыў.)
дададзена аўтар murray, крыніца

Вы таксама можаце зрабіць гэта з битмаской:

masks = {
    0b100: 'r',  # 4
    0b010: 'x',  # 2
    0b001: 'w'   # 1
}

octal = raw_input('Octal? ')
result = '-'

for digit in octal[1:]:
    for mask, letter in sorted(masks.items(), reverse=True):
        if int(digit, 8) & mask:
            result += letter
        else:
            result += '-'

print result
4
дададзена
@ LauritzV.Thaulow: Так, дзякуй. Гэта некалькі прадказальны ў CPython.
дададзена аўтар Blender, крыніца
Хм, вы належыце на парадак masks.items() , які з'яўляецца нявызначаным. Не значыць спарадкаваныя (masks.items (), зваротная = True) ?
дададзена аўтар Lauritz V. Thaulow, крыніца

Вось мая версія, натхнёныя рашэнні ў Blender:

bits = zip([4, 2, 1], "rwx")
groups = "ugo"

s = raw_input("Octal?  ");
digits = map(int, s)

parts = []
for group, digit in zip(groups, digits):
    letters = [letter for bit, letter in bits if digit & bit]
    parts.append("{0}={1}".format(group, "".join(letters)))

print ",".join(parts)

Я думаю, што лепш не трэба відавочна ўвесці пошук спіс.

2
дададзена
«Шэсць з аднаго, паўтузіна іншага» ?? Terser код, калі адзін фармуе пошук Спіс супраць больш доўгі код, але больш Clode у той час як бліжэй да духу, як дазволу разлічваюцца з біт маніпуляцыі. Мне падабаюцца маленькія праблемы, якія настолькі багатыя магчымымі рашэннямі. Дзякуючы ўсім укладчыкам тут.
дададзена аўтар murray, крыніца

Вось мая версія, натхнёныя рашэнні ў Blender:

bits = zip([4, 2, 1], "rwx")
groups = "ugo"

s = raw_input("Octal?  ");
digits = map(int, s)

parts = []
for group, digit in zip(groups, digits):
    letters = [letter for bit, letter in bits if digit & bit]
    parts.append("{0}={1}".format(group, "".join(letters)))

print ",".join(parts)

Я думаю, што лепш не трэба відавочна ўвесці пошук спіс.

2
дададзена
«Шэсць з аднаго, паўтузіна іншага» ?? Terser код, калі адзін фармуе пошук Спіс супраць больш доўгі код, але больш Clode у той час як бліжэй да духу, як дазволу разлічваюцца з біт маніпуляцыі. Мне падабаюцца маленькія праблемы, якія настолькі багатыя магчымымі рашэннямі. Дзякуючы ўсім укладчыкам тут.
дададзена аўтар murray, крыніца

Вось мая расколіна на яго (у тым ліку «-» для якія адсутнічаюць дазволаў):

lookup = {
    0b000 : '---',
    0b001 : '--x',
    0b010 : '-w-',
    0b011 : '-wx',
    0b100 : 'r--',
    0b101 : 'r-x',
    0b110 : 'rw-',
    0b111 : 'rwx'
}

s = raw_input('octal?: ')
print(','.join( # using ',' as the delimiter
               r + '=' + lookup[int(n, 8)] # the letter followed by the permissions
               for n, r  in zip(tuple(s), 'ugo'))) # for each number/ letter pair
1
дададзена
+1, але я б зашпілька-маланка (s, 'Ugo') для сцісласці.
дададзена аўтар Lev Levitsky, крыніца
@LevLevitsky ах да, вядома,
дададзена аўтар Ryan Haining, крыніца

Вось мая расколіна на яго (у тым ліку «-» для якія адсутнічаюць дазволаў):

lookup = {
    0b000 : '---',
    0b001 : '--x',
    0b010 : '-w-',
    0b011 : '-wx',
    0b100 : 'r--',
    0b101 : 'r-x',
    0b110 : 'rw-',
    0b111 : 'rwx'
}

s = raw_input('octal?: ')
print(','.join( # using ',' as the delimiter
               r + '=' + lookup[int(n, 8)] # the letter followed by the permissions
               for n, r  in zip(tuple(s), 'ugo'))) # for each number/ letter pair
1
дададзена
+1, але я б зашпілька-маланка (s, 'Ugo') для сцісласці.
дададзена аўтар Lev Levitsky, крыніца
@LevLevitsky ах да, вядома,
дададзена аўтар Ryan Haining, крыніца