반응형

출처

http://stackoverflow.com/questions/16819222/how-to-return-dictionary-keys-as-a-list-in-python-3-3

Youtube

https://youtu.be/tnJqNEc9knk

Google Colab

https://colab.research.google.com/drive/1PZGbth0ZArjDPkzPBNpT4uCZjRDKPhQ0?usp=sharing

Python에서 dictionary 키를 list로 리턴하는 방법

저는 뭔가 매우 이상하다는 것을 알았습니다. Python 2.7과 Python 3의 오래된 버전에서 뭔가 많이 다른 것이 있습니다.

이전에, dictionary에서 key 값, value 값, item 값을 list로 쉽게 얻을 수 있었습니다.

  • Python 2.7
>>> newdict = {1:0, 2:0, 3:0} 
>>> newdict
{1: 0, 2: 0, 3: 0} 
>>> newdict.keys()
[1, 2, 3]

하지만 Python 3에서는 다음처럼 이렇게 나옵니다.

  • PYTHON 3.3.0
>>> newdict.keys() 
dict_keys([1, 2, 3])

3 개의 답변 중 1 개의 답변만 추려냄.

list(newdict.keys()) 를 시도해 보세요.

이는 dict_keys 객체를 list로 변환할 것입니다.
반면, 당신은 이것이 문제가 되는지 아닌지 스스로에게 물어봐야 합니다. 코드를 Python의 방법으로 작성하는 것은 duck typing(만약 그것이 오리처럼 생겼고, 오리처럼 꽥꽥 운다면 그것은 오리입니다.) 이라 가정합니다. dict_keys 객체는 대부분 list처럼 행동합니다. 예를 들면, 다음 소스처럼 list처럼 작동합니다.

for key in newdict.keys():
    print(key)

1
2
3

답변 후 추가 편집 내용

감사합니다. list(newdict.keys())가 제가 원하는대로 작동합니다.

현재는 다른 것이 저를 괴롭히고 있습니다. 저는 value 값으로 정렬하여 dictionary key 값과 value 값들을 뒤집어(reverse) list로 생성하고 싶습니다. 다음처럼 소스를 작성하였습니다. (다음은 나쁜 예시입니다. 모든 value 값들이 0이기 때문입니다.)

>>> zip(newdict.values(), newdict.keys())
[(0, 1), (0, 2), (0, 3)]

하지만, Python 3에서는 다음처럼 나옵니다.

>>> zip(list(newdict.keys()), list(newdict.values())) <zip object at 0x7f367c7df488>

아, 죄송합니다.

zip() 밖으로 list() 함수를 사용해야 됨을 알았습니다.

list(zip(newdict.values(), newdict.keys())) [(0, 1), (0, 2), (0, 3)]
반응형
반응형

출처 : http://stackoverflow.com/questions/7515266/rounding-problem-with-python

파이썬에서 반올림 문제

파이썬에서 반올림 문제가 있습니다. 제가 다음을 계산하면

32.50 * 0.19 = 6.1749999999999998

가 됩니다. 하지만 이는 6.175가 되어야 합니다. 만약 둘째 자리로 6.1749999999999998을 반올림하면 정확히 6.18을 보여줍니다. 여기까지는 괜찮습니다.

하지만 이를 계산하면

32.50 * 0.19 * 3 = 18.524999999999999

가 됩니다. 이는 18.525가 되어야 합니다. 만약 둘째 자리로 18.524999999999999을 반올림하면 18.52를 보여주어야 합니다.

이 값은 저에게 18.53을 보여주어야 합니다. 제가 무엇을 잘못했는지와 어떻게 이 현상을 고칠 수 있을까요?


7 개의 답변 중 2 개의 답변

당신은 잘못한 게 없고, 파이썬의 잘못도 아닙니다. 몇개의 십진 숫자들은 이진 부동형으로 정확하게 표현을 못할 뿐입니다.

1/3을 십진수로 (0.3333....) 정확히 쓸 수 없는 거처럼, 0.1을 이진수로는(0.000110011...)을 정확히 쓸 수 없습니다.

해결책 A:

print 32.5 * 0.19를 사용합니다. 이는 결과를 자동으로 반올림 합니다.

해결책 B:

예를 들어 통화 값을 계산할 때처럼 정확한 값이 필요하면 Decimal모듈을 사용합니다.

import decimal
D=decimal.Decimal

x=D('32.50')*D('0.19')
print(x)
# 6.1750
print(x.quantize(D('0.01'),rounding=decimal.ROUND_HALF_UP))
# 6.18

y=D('32.50')*D('0.19')*D('3')
print(y)
# 18.5250
print(y.quantize(D('0.01'),rounding=decimal.ROUND_HALF_UP))
# 18.53

해결책 C:

interactive session에서 결과를 자동으로 반올림하는 Python 3.2나 Python 2.7을 사용합니다.

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 32.50 * 0.19
6.175

모든 컴퓨터 과학자들이 알아야 할 부동 소수점 계산에 관한 것.

즉, 부동 소수점은 메모리에 저장되어 있는 방법 때문에 정확한 값이라고 의지하면 안 됩니다.

Python 문서에서 이에 관한 것도 보십시오 - 부동 소수점 산수: 이슈와 한계. 이는 다음 구문을 포함합니다.

예를 들어, 둘째 자리로 2.675를 반올림을 시도하면, 다음을 얻을 수 있습니다.
>>> round(2.675, 2)
2.67
빌트인 round 함수에 대한 문서는 가장 가까운 값으로 반올림하고 0에서 멀어지는 쪽으로 올림 혹은 내림 합니다. 십진수 유리수인 2.675는 정확히 2.67과 2.68이기 때문에, 당신은 (이진 근사로) 2.68이 여기 결과로 기대할 것입니다. 하지만 그렇지 않은데 십진수 문자열 2.675는 이진 부동 소수점으로 변환될 때, 이진 근사값으로 대체되는 데 정확한 값은
2.67499999999999982236431605997495353221893310546875 입니다.
이 근사값은 2.68보다는 2.67에 더 가깝기 때문에 내림이 됩니다.

반응형
반응형

출처 : http://stackoverflow.com/questions/8494209/modulus-in-django-template

Django Template의 나머지(%) 연산

저는 django에서 나머지 연산자 같은 것을 사용하는 방법을 찾고 있습니다. 제가 하려고 하는 것은 루프문에서 4번째 요소마다 클래스 이름을 추가하는 것입니다.

나머지 연산자를 사용하여 다음처럼 작성하였습니다.

당연히 %가 탬플릿에서 예약된 문자이기 때문에 작동을 안할 것입니다. 이를 할 수 있는 다른 방법이 있을까요?


3 개의 답변 중 1개의 답변만 추려냄.

내장된(build-in) django filter인 divisibleby가 필요합니다.

{% for p in posts %}
    <div class="post width1 height2 column {% if forloop.counter0|divisibleby:4 %}first{% endif %}">
        <div class="preview">

        </div>
        <div class="overlay">

        </div>
        <h2>p.title</h2>
    </div>
{% endfor %}
반응형
반응형

출처 : http://stackoverflow.com/questions/1191374/using-module-subprocess-with-timeout

timeout과 함께 'subprocess' 모듈 사용하기

여기에 stdout 데이터를 리턴하는 임의의 명령어를 실행하거나 0이 아닌 종료 코드에서 예외를 발생시키는 파이썬 코드가 있습니다.

proc = subprocess.Popen(
    cmd,
    stderr=subprocess.STDOUT,  # Merge stdout and stderr
    stdout=subprocess.PIPE,
    shell=True)

communicate는 프로세스가 종료하기를 기다리는 데 사용합니다.

stdoutdata, stderrdata = proc.communicate()

subprocess 모듈은 몇 초 이상 실행하고 있는 프로세스를 없애는(kill) timtout 능력을 지원하지 않습니다. 그래서 communicate는 영원히 실행될 수 있습니다.
윈도우즈나 리눅스에서 실행하는 데 파이썬 프로그램에서 timeout을 구현할 수 있는 간단한 방법이 있을까요?


20 개의 답변 중 2개의 답변만 추려냄.

Python 3.3+ 에서

from subprocess import STDOUT, check_output

output = check_output(cmd, stderr=STDOUT, timeout=seconds)

output은 명령어의 표준 출력, 표준 에러 데이터가 합쳐진 것을 포함하는 바이트 문자열입니다.

check_output(check_output)은 proc.communicate() 메소드와는 다르게 문제 텍스트에 지정된 대로 0이 아닌 종료 상태에서 CalledProcessError를 발생시킵니다.

저는 불필요하게 자주 사용되기 때문에 shell=True를 제거하였습니다. cmd에서 실제로 필요한 경우 언제든지 다시 추가할 수 있습니다. shell=True를 추가하면 즉, 자식 프로세스가 자체 하위 항목을 생성하는 경우; check_output()은 시간 초과가 나타내는 것보다 훨씬 늦게 반환 할 수 있습니다. Subprocess timeout 실패를 참조하세요.

타임 아웃 기능은 3.2+ subprocess 모듈의 subprocess32(subprocess32) 백 포트를 통해 Python 2.x에서 사용할 수 있습니다.


유닉스를 사용하신다면,

import signal
  ...
class Alarm(Exception):
    pass

def alarm_handler(signum, frame):
    raise Alarm

signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(5*60)  # 5분
try:
    stdoutdata, stderrdata = proc.communicate()
    signal.alarm(0)  # 알람을 리셋한다.
except Alarm:
    print "헉, 너무 오래 걸립니다!"
    # 그 밖에 무엇이든
반응형
반응형

출처

출처 : https://stackoverflow.com/questions/8689964/why-do-some-functions-have-underscores-before-and-after-the-function-name

파이썬 : 왜 함수 이름 앞과 뒤에 "__"를 가진 함수들이 있을까요?

이러한 "밑줄" 형태는 많이 보이는 거 같고 파이썬 언어의 요구사항인지 아니면 convention의 문제인지 궁금합니다.

또한, 누군가가 어떤 함수가 밑줄(_)을 가지는 경향이 있고 그 이유(예를 들어, __init__)가 무엇인지 설명해주셨으면 합니다.


6 개의 답변 중 1개의 답변만 추려냄.

Python PEP 8로부터 -- 파이썬 코드의 스타일 가이드 (https://www.python.org/dev/peps/pep-0008/) :

the following special forms using leading or trailing underscores are recognized (these can generally be combined with any case convention):

앞이나 뒤에 밑줄표기(_)를 사용하는 다음 특별한 형태는 다음처럼 인식될 수 있습니다. (이들은 일반적으로 어떤 경우의 convention과 결합될 수 있습니다.)

  • _single_leading_underscore: weak "internal use" indicator. E.g. from M import * does not import objects whose name starts with an underscore.

  • _하나의_앞에있는_밑줄: 약한 "내부적 사용"을 표시함. 예) "from M import *"은 밑줄로 시작하는 이름의 객체들을 가져오지(import) 않습니다.

  • single_trailing_underscore_: used by convention to avoid conflicts with Python keyword, e.g.

  • 하나의_뒤에있는_밑줄_: 파이썬 키워드와 혼동을 막기 위해 사용하는 convention입니다. 예를들어

    Tkinter.Toplevel(master, class_='ClassName')
  • __double_leading_underscore: when naming a class attribute, invokes name mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).

  • __두개의_앞에있는_밑줄: 클래스 속성에 이름을 붙일 때 속성의 이름을 내부적으로 바꿉니다. (내부적으로 바꾸는 규칙에 의해 Foobar 클래스 내부에 있는 __boo_FooBar_boo;가 됩니다.)

  • __double_leading_and_trailing_underscore__: "magic" objects or attributes that live in user-controlled namespaces. E.g. __init__, __import__ or __file__. Never invent such names; only use them as documented.

  • __두개의_앞에있는_그리고_뒤에있는_밑줄__ : 사용자가 제어하는 이름공간에 "마법" 객체나 속성. 예시 __init__, __import__ 또는 __file__. 이러한 이름을 새로 만들지 말아야 합니다. 오직 문서화된대로만 이들을 사용해야 합니다.)

두개의_앞에있는_그리고_뒤에있는_밑줄은 본질적으로 파이썬 자체적으로 예약되어 있습니다. "이러한 이름을 새로 만들지 말고 문서화된 대로만 그들을 사용해야 합니다."

반응형
반응형

출처 : http://stackoverflow.com/questions/60208/replacements-for-switch-statement-in-python

파이썬에서 switch 구문을 대체하여 사용하는 방법

입력 index의 값을 기본으로 하여 다른 고정된 값을 리턴하는 파이썬의 함수를 작성하고 싶습니다.

다른 언어에서 저는 switch 또는 case 구문을 사용하고 싶지만 파이썬은 구문을 가지고 있는 것처럼 보이지 않습니다. 이러한 경우 파이썬에서 추천할만한 해결책은 무엇이 있습니까?


30 개의 답변 중 2개의 답변만 추려냄.

원래 아래 답변은 2008년에 작성했습니다. 그 이후로 Python 3.10 (2021)은 Python에서 "switch"의 일류 구현을 제공하는 match-case 구문을 소개하였습니다. 예를 들면 다음처럼 작성가능합니다.

def f(x):
    match x:
        case 'a':
            return 1
        case 'b':
            return 2

match-case 문은 이 간단한 예제보다 훨씬 더 강력합니다.

당신은 dictionary를 사용할 수 있습니다.

def f(x):
    return {
        'a': 1,
        'b': 2,
    }[x]

만약 당신이 default를 사용하고 싶다면, dictionary의 get(key[, default]) 메소드를 사용할 수 있습니다.

def f(x):
    return {
        'a': 1,
        'b': 2,
    }.get(x, 9)    # 9 is default if x not found

위의 답변과 관련하여

http://www.tutorialspoint.com/python/dictionary_get.htm

위 사이트에서 dictionary get 메소드에 대한 내용을 확인하실 수 있습니다.

반응형
반응형

출처 : http://stackoverflow.com/questions/9475241/split-python-string-every-nth-character

n번째 문자마다 문자열을 나누는 방법?

n번째 문자마다 파이썬 문자열을 나누는 것이 가능한가요?

예를 들어, 다음을 포함하는 문자열이 있다고 가정합니다.

'1234567890'

다음처럼 보이게 하려면 어떻게 해야 할까요?

['12','34','56','78','90']

17 개의 답변 중 3개의 답변만 추려냄.

>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']

파이썬에 내장 함수로 이를 구현한 것이 이미 있습니다.

>>> from textwrap import wrap
>>> s = '1234567890'
>>> wrap(s, 2)
['12', '34', '56', '78', '90']

docstring이 wrap에 대해 말하는 내용 입니다.

>>> help(wrap)
'''
Help on function wrap in module textwrap:

wrap(text, width=70, **kwargs)
    Wrap a single paragraph of text, returning a list of wrapped lines.

    Reformat the single paragraph in 'text' so it fits in lines of no
    more than 'width' columns, and return a list of wrapped lines.  By
    default, tabs in 'text' are expanded with string.expandtabs(), and
    all other whitespace characters (including newline) are converted to
    space.  See TextWrapper class for available keyword args to customize
    wrapping behaviour.
'''

이 소스가 itertools 보다 더 짧고 읽기 좋다고 생각합니다.

def split_by_n( seq, n ):
    """A generator to divide a sequence into chunks of n units."""
    while seq:
        yield seq[:n]
        seq = seq[n:]

print list(split_by_n("1234567890",2))

위의 소스와 관련하여

http://haerakai.tistory.com/34

위 주소의 제너레이터와 이더레이터 부분을 보시면 더 이해하기 좋다고 생각합니다.


위의 답변을 참고하여
https://github.com/SDRLurker/TIL/blob/master/python/slice.py
소스를 제작하였습니다.

반응형
반응형

출처 : http://stackoverflow.com/questions/9001509/how-can-i-sort-a-dictionary-by-key

키로 dictionary를 어떻게 정렬할 수 있습니까?

{2:3, 1:89, 4:5, 3:3}{1:89, 2:3, 3:3, 4:5}로 만드는 좋은 방법에는 무엇이 있습니까? 저는 몇 개의 글을 검사했는데 그들 모두 튜플을 리턴하는 "sorted" 연산자를 사용하였습니다.


30 개의 답변 중 1개의 답변만 추려냄.

표준 파이썬 dictionary들은 정렬되지 않습니다. (key, value) 쌍으로 정렬할 지라도 순서를 보전하면서 dict의 내용을 보관할 수는 없습니다.

가장 쉬운 방법은 값(element)이 추가되는 순서를 기억하는 OrderedDict를 사용하는 것입니다.

In [1]: import collections
In [2]: d = {2:3, 1:89, 4:5, 3:0}
In [3]: od = collections.OrderedDict(sorted(d.items()))
In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])

od가 출력하는 방법은 신경쓰지 않아도 됩니다. 예상한대로 작동합니다.

In [11]: od[1]
Out[11]: 89

In [12]: od[3]
Out[12]: 0

In [13]: for k, v in od.iteritems(): print k, v
   ....: 
1 89
2 3
3 0
4 5

Python 3

Python3 사용자는 .iteritems() 대신에 .items()을 사용해야 합니다.

In [13]: for k, v in od.items(): print(k, v)
   ....: 
1 89
2 3
3 0
4 5
반응형

+ Recent posts