파이썬을 처음 접했을 때 필자는 파이썬을 배울 수있는 타사 유틸리티를 포함하지 않는 솔루션을 만들었습니다. 여기에는 먼저 테이블 항목을 문자열 및 숫자 유형 항목 사전 목록으로 그룹화하는 과정이 포함됩니다. 나는 당신에게 파일을 읽게 남겨 둘 것입니다.
주 파일의 빈 항목은 다음과 같습니다.
entries = [ {"Date":"", "ItemType":"", "Sales":int(), "Partner":""}, ... ]
나는 당신이 필요로하는 것을 정확하게하기 위해 3 가지 기능을 만들었습니다.
filter_entries(entries, filter_key)
가 키의 사전 반환 항목을 기반 엔트리 목록 항목 여기서 엔트리리스트 [filter_key] 값은 동일
expand_entries(entries, expand_key)
에서, 으로 엔트리리스트를 반환 모두 초급 리스트 [expand_key]을 제거하고 모든 고유 키로 대체 다음 expand_key
merge_entries(entries, merge_key)
에 기초한 값 쌍은 항목 기반으로 엔트리리스트를 반환 여기서 동일한 항목 [merge_key] 값이 결합되어 모든 항목
,451,515,
:
def filter_entries(entries, filter_key):
unique_values = set([e[expand_key] for e in entries])
filtered_entries = {}
for filter_value in unique_values:
filtered_entries [filter_value] = [e for e in in entries if e[filter_key] == filter_value]
return filtered_entries
def expand_entries(entries, expand_key):
unique_values = set([e[expand_key] for e in entries])
new_entries = []
for entry in entries:
new_entries.append({key:value for key,value in entries.items() if not key == expand_key})
for new_key in unique_values:
new_entries[-1][new_key] = 1 if entry[expand_key] == new_key else 0
return new_entries
항목을 병합하려면, 내가 그 문자열 키 - 값을 주장하는 것 같은 문자열이어야합니다. 그렇지 않으면 오류입니다. 즉, 합병 적절한 값는 다음과 같다 :
2014/01/01 A 100
2014/01/01 A 60
---------------------------------
2014/01/01 A 160
와 나쁜 경우는 다음과 같습니다
이
def merge_entries(entries, merge_key):
unique_keys = set([e[merge_key] for e in entries])
new_entries = []
for key in unique_keys:
new_entry = None
for entry in [e for e in entries if e[merge_key] == key]:
# copy the style of the first entry with that key
if new_entry is None:
new_entry = {key:value for key,value in entry.items()}
for key,value in new_entry.items():
if not type(value) == str:
new_entry[key] = 0.0
for key,value in entry.items():
if type(value) == str:
if not new_entry[key] == value:
raise Exception("Cannot merge different string for Key {}: {}, {}".format(key,value, new_entry[key]))
else:
new_entry[key] += value
new_entries.append(new_entry)
return new_entries
마지막으로 약간의 지능형리스트와 함께 최고 수준의 코드는 간단하다 :
2014/01/01 A 100
2014/01/01 B 60
---------------------------------
Value error A , B
>>> entries = [ {"Date":"aaaa", "ItemType":"A", "Sales":10, "Partner":"P1"},
{"Date":"aaaa", "ItemType":"A", "Sales":15, "Partner":"P2"},
{"Date":"cccc", "ItemType":"A", "Sales":15, "Partner":"P2"},
{"Date":"bbbb", "ItemType":"A", "Sales":15, "Partner":"P2"},
{"Date":"bbbb", "ItemType":"B", "Sales":10, "Partner":"P3"},
{"Date":"bbbb", "ItemType":"B", "Sales":15, "Partner":"P2"},
{"Date":"cccc", "ItemType":"B", "Sales":10, "Partner":"P3"}]
>>> f_entries = filter_entries(entries, "ItemType")
>>> e_entries = {key:expand_entries(entries, "Partner") for key, entries in f_entries.items()}
>>> m_entries = {key:merge_entries(entries, "Date") for key, entries in e_entries.items()}
>>> for key in m_entries.keys():
print key
for entry in m_entries[key]:
print entry
A
{'Date': 'aaaa', 'P2': 1.0, 'P1': 1.0, 'ItemType': 'A', 'Sales': 25.0}
{'Date': 'cccc', 'P2': 1.0, 'P1': 0.0, 'ItemType': 'A', 'Sales': 15.0}
{'Date': 'bbbb', 'P2': 1.0, 'P1': 0.0, 'ItemType': 'A', 'Sales': 15.0}
B
{'Date': 'cccc', 'P2': 0.0, 'Sales': 10.0, 'ItemType': 'B', 'P3': 1.0}
{'Date': 'bbbb', 'P2': 1.0, 'Sales': 25.0, 'ItemType': 'B', 'P3': 1.0}
저는 이 형식으로 테이블에 파일을 쓰는 것은 어렵지 않을 것입니다!
도움 주셔서 감사합니다. 나는 어떻게 (print ([1,2,3,4] [: 2])) 지난 10 날짜를 잡고 이해가 안 돼요. – user3519466
이것은 슬라이스 표기법의 예입니다. 사용 사례에 맞게 수정해야합니다. [이 질문] (http://stackoverflow.com/q/509211/344286)에서 알아야 할 모든 내용을 설명해야합니다. –