내 질문에 고전적인 것처럼 보이지만 정확히 stackoverflow에서 동일한 질문을 찾을 수 없습니다. 나는 내 질문이 중복 된 질문이 아니기를 바랍니다.어떻게 파이썬에서 중복 행을 효율적으로 필터링 할 수 있습니까?
큰 파일이 있습니다. 파일에는 많은 행과 고정 열이 있습니다. 나는 모든 열 중에서 열 A와 열 B에 관심이 있습니다. 목표는 (1) 행의 A 열의 값이 다른 행에도 나타나고 (2) A 열과 동일한 값을 가진 행이 두 개 이상있는 행을 얻고 자하는 것입니다. B 열의 다른 값.
다음 표를 고려하십시오. 3 행에 "a"가 나타나고 B 열의 값이 다르기 때문에 행 1,3,5에 관심이 있습니다. 반대로 "b"가 두 번 나타나기 때문에 행 2와 4에는 관심이 없지만 B 열의 해당 값은 항상 "1"입니다. 마찬가지로 "c"가 한 번만 표시되기 때문에 행 6에도 관심이 없습니다.
# A B C D ========= 1 a 0 x x 2 b 1 x x 3 a 2 x x 4 b 1 x x 5 a 3 x x 6 c 1 x x는 객체와 각 라인을 변환, 내가 파일의 모든 라인을 읽고, 이러한 열을 찾을 개체에 대한 목록을 작성, 다음과 같은 알고리즘 흥미로운 열을 찾을 수 있습니다. 알고리즘은 작동하지만 내 데이터 세트에 시간이 걸립니다. 알고리즘을 효율적으로 만들 수있는 제안이 있습니까?
def getDuplicateList(oldlist):
# find duplicate elements
duplicate = set()
a_to_b = {}
for elements in oldlist:
a = elements.getA()
b = elements.getB()
if a in a_to_b:
if b != a_to_b[a]:
duplicate.add(a)
a_to_b[a] = b
# get duplicate list
newlist = []
for elements in oldlist:
a = elements.getA()
if a in duplicate:
newlist.append(a)
return newlist
p.s. 나는 명확히하기 위해 몇 가지 제약 조건을 추가한다. 내가
- :
duplicate
는 "일부"흥미로운 "A"의가 있습니다. - 순서가 중요합니다.
- 실제로 데이터는 프로그램 실행의 메모리 액세스입니다. A 열에는 메모리 액세스가 있고 B 열에는 내가 관심있는 몇 가지 조건이 있습니다. 런타임에 메모리 액세스에 여러 조건이있는 경우 메모리 액세스 순서를 조사하고 싶습니다.
호기심에서 벗어나 수백, 수천, 수만 개가 몇 줄입니까? –
각 파일에는 수십만 개의 파일이 있으며 그 중 수백 개의 파일이 있습니다. 처리하는 데 몇 분이 걸립니다. – Sangmin
(b 1), (b 1), (b 2)의 경우가 "흥미로운"것이겠습니까? 두 번째 값은 중복되지만 다른 값 * 또한 *가 있습니다. – Malvolio