반응형

출처 : https://stackoverflow.com/questions/3428536/python-list-subtraction-operation

파이썬 리스트 차집합 연산

저는 다음과 비슷하게 뭔가 하고 싶습니다.

>>> x = [1,2,3,4,5,6,7,8,9,0]  
>>> x  
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]  
>>> y = [1,3,5,7,9]  
>>> y  
[1, 3, 5, 7, 9]  
>>> y - x   # ([2,4,6,8,0]를 리턴해야 합니다.)

이 방법은 파이썬 리스트에서 지원되지 않습니다. 이를 할 수 있는 최고의 방법은 무엇입니까?

12개의 답변 중 2개의 답변만 추려냄

리스트 내포(comprehension)을 사용합니다.

[item for item in x if item not in y]

만약 - 중위 연산 문법을 사용하고 싶으면 다음처럼 할 수 있습니다.

class MyList(list):
    def __init__(self, *args):
        super(MyList, self).__init__(args)

    def __sub__(self, other):
        return self.__class__(*[item for item in self if item not in other])

다음처럼 사용할 수 있습니다.

x = MyList(1, 2, 3, 4)
y = MyList(2, 5, 2)
z = x - y

하지만 만약 리스트 속성이 절대적으로 필요하지 않다면(예시, 순서), 다른 답변처럼 set(집합)을 사용하는 것을 추천합니다.


set difference 를 사용합니다.

>>> z = list(set(x) - set(y))
>>> z
[0, 8, 2, 4, 6]

또는 x와 y를 집합으로 설정하여 (리스트로) 변환을 수행할 필요가 없습니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/4260280/if-else-in-pythons-list-comprehension

파이썬 list comprehension에서 if/else 구문 사용법?

파이썬에서 어떻게 다음 구문을 할 수 있습니까?

row = [unicode(x.strip()) for x in row if x is not None else '']

특별히:

  1. 빈 문자열을 None으로 대체하고

  2. 함수를 실행하고 싶습니다.


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

이렇게 하실 수 있고 순서의 문제입니다.

[ unicode(x.strip()) if x is not None else '' for x in row ]

일반적으로,

[f(x) if condition else g(x) for x in sequence]

if 조건만으로 for list comprehensions을 사용한다면

[f(x) for x in sequence if condition]

이는 실제로 다른 언어 구문인 조건부 표현식을 사용하는 데, 그 자체는 list comprehension 문법의 일부가 아니며 if 뒤에 for…in 이 list comprehension이며 원래 데이터(source)를 순회(iterable)하면서 각 요소를 필터링하는데 (조건부 표현식이) 사용됩니다.

조건식은 2가지 값 중 선택하려는 모든 종류의 상황에서 사용할 수 있습니다. 이 조건식은 다른 언어에도 존재하는 ?: 삼항 연산자 와 같습니다. 예를 들면

value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')

이렇게 사용하실 수 있습니다.

반응형
반응형

출처

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)]
반응형

+ Recent posts