2017-11-28 13 views
0

먼저 아래 코드를 살펴보십시오.문자열 대체 메서드에 대한 다른 제안은 무엇입니까? Python

import string 

DNA=["Alpha", "Bravo", "Charlie", "Delta", "Echo", "CharlieChoo", "DeltaAir", "Alpha bet", "ChooChoo", "Airline"] 

body = "{\"startDate\":\"2016-01-01\"\ 
,\"endDate\":\"2017-10-30\"\ 
,\"timeUnit\":\"date\"\ 
,\"keywordGroups\":[{\"groupName\":\"Alpha\",\"keywords\":[\"Alpha\"]}\ 
,{\"groupName\":\"Bravo\",\"keywords\":[\"Bravo\"]}\ 
,{\"groupName\":\"Charlie\",\"keywords\":[\"Charlie\"]}\ 
,{\"groupName\":\"Delta\",\"keywords\":[\"Delta\"]}\ 
,{\"groupName\":\"Echo\",\"keywords\":[\"Echo\"]}]\ 
,\"device\":\"\",\"ages\":[\"1\",\"11\"],\"gender\":\"\"}" 

body = body.replace(DNA[0],DNA[5],2) 
body = body.replace(DNA[1],DNA[6],2) 
body = body.replace(DNA[2],DNA[7],2) 
body = body.replace(DNA[3],DNA[8],2) 
body = body.replace(DNA[4],DNA[9],2) 

body 

는 출력이

'{"startDate":"2016-01-01","endDate":"2017-10-30","timeUnit":"date","keywordGroups": 
[{"groupName":"Alpha betChoo","keywords":["Alpha betChoo"]}, 
{"groupName":"ChooChooAir","keywords":["ChooChooAir"]}, 
{"groupName":"Charlie","keywords":["Charlie"]}, 
{"groupName":"Delta","keywords":["Delta"]}, 
{"groupName":"Airline","keywords":["Airline"]}],"device":"","ages": 
["1","11"],"gender":""}' 

내 의도 된 출력 그래서 기본적으로

#body = "{\"startDate\":\"2016-01-01\"\ 
#,\"endDate\":\"2017-10-30\"\ 
#,\"timeUnit\":\"date\"\ 
#,\"keywordGroups\":[{\"groupName\":\"CharlieChoo\",\"keywords\":[\"CharlieChoo\"]}\ 
#,{\"groupName\":\"DeltaAir\",\"keywords\":[\"DeltaAir\"]}\ 
#,{\"groupName\":\"Alpha bet\",\"keywords\":[\"Alpha bet\"]}\ 
#,{\"groupName\":\"ChooChoo\",\"keywords\":[\"ChooChoo\"]}\ 
#,{\"groupName\":\"Airline\",\"keywords\":[\"Airline\"]}]\ 
#,\"device\":\"\",\"ages\":[\"1\",\"11\"],\"gender\":\"\"}" 

아래 아래 내가 DNA 목록에서 groupName을 키워드를 교체하려고했던 것입니다. 이 예제에서는 DNA 목록에 10 obj 만 있지만 실제 프로젝트에는 몇 천 개가 포함되어 있습니다.

개인적인 생각은 문자열이 겹칠 가능성이 있으므로 문자열을 대체하는 것이 적절하지 않다는 것입니다. 내 작업을 수행하는 다른 방법이 있습니까? 한가지 고려해야 할 것은 출력을 동일한 유형의 첫 번째 본문 문자열 (단어 만 변경됨)로 사용해야한다는 것입니다. 미리 감사드립니다.

-------------------------------------- EDIT --- -------------------------------------------------- ----------

@ AJAX1234 답변에 대한 새 오류가 발생했습니다.

import pandas as pd 
import json 
#reading xlsx file 
ex = pd.ExcelFile('mat_hierarchy.xlsx').parse('Sheet1') 
DNA = ex.loc[:,'4Level'] 
DNA 

이 위 내 DNA 파일이며, 아래에이 정보를 사용하여 출력

0   Fruit 
1   MixFruit 
2   SuperFruit 
3   PassionFruit 
4   Orange 
5   Lemon 
6   Mango 
................. it goes on forever :( 

, 난 오류가 계속 표시입니다 "이름 a가 정의되지 않은"당신의 코드를 실행. 나는 초보자지만 내 최고의 추측은 "DNA"가 색인 (DNA.index [0] 등)으로 정의되어 있고 코드로 "a"를 숫자로 변경했으며 여전히 작동하지 않는다는 것입니다.

이 문제와 관련된 제안 사항이 있습니까? 입력 해 주셔서 감사합니다.

------------------------ 편집 2 -------------------- -----------

body_intro = "{\"startDate\":\"2016-01-01\",\"endDate\":\"2017-10-30\",\"timeUnit\":\"date\",\"keywordGroups\":[{\"groupName\":\"" 
body_keywords = "\",\"keywords\":[\"" 
body_groupName = "\"]},{\"groupName\":\"" 
body_last = "\"]}],\"device\":\"\",\"ages\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\"],\"gender\":\"f\"}" 


for i in range(0,len(DNA),5): 
    if((len(DNA)%5==0) or (i < (len(DNA)-(len(DNA)%5)))): 
    body = body_intro + DNA[i] + body_keywords + DNA[i] + body_groupName + DNA[i+1] + body_keywords + DNA[i+1] + body_groupName + DNA[i+2] + body_keywords + DNA[i+2] + body_groupName + DNA[i+3] + body_keywords + DNA[i+3] + body_groupName + DNA[i+4] + body_keywords + DNA[i+4] + body_last  
    elif(len(DNA)%5==4): 
    body = body_intro + DNA[i] + body_keywords + DNA[i] + body_groupName + DNA[i+1] + body_keywords + DNA[i+1] + body_groupName + DNA[i+2] + body_keywords + DNA[i+2] + body_groupName + DNA[i+3] + body_keywords + DNA[i+3] + body_last  
    elif(len(DNA)%5==3): 
    body = body_intro + DNA[i] + body_keywords + DNA[i] + body_groupName + DNA[i+1] + body_keywords + DNA[i+1] + body_groupName + DNA[i+2] + body_keywords + DNA[i+2] + body_last  
    elif(len(DNA)%5==2): 
    body = body_intro + DNA[i] + body_keywords + DNA[i] + body_groupName + DNA[i+1] + body_keywords + DNA[i+1] + body_last  
    else: 
    body = body_intro + DNA[i] + body_keywords + DNA[i] + body_last  
+0

개인적으로 [이 답변] (https://stackoverflow.com/a/6117124/2364363)과 같이 개인적으로는 정규 표현식을 사용하여 대체 할 수 있습니다. – uber5001

+0

DNA 목록에 [ 't1', 't2', 't3', 't4', 't5', 't6', 't7', 's1', 's2', 's3' , 's4', 's5', 's6', 's7']? 키워드 t의 수는 s의 수와 같습니다. 그렇다면 아래 나의 대답을 시도하십시오. – chx3

답변

2

당신이 시도 할 수 있습니다 :

import json 
new_body = json.loads(body) 
DNA=["Alpha", "Bravo", "Charlie", "Delta", "Echo", "CharlieChoo", "DeltaAir", "Alpha bet", "ChooChoo", "Airline"] 
new_body['keywordGroups'] = [{c:[DNA[DNA.index(a)+5] for a in d] if isinstance(d, list) else DNA[DNA.index(a)+5] for c, d in i.items()} for i in new_body['keywordGroups']] 
final_data = json.dumps(new_body) 

출력 :

'{"startDate": "2016-01-01", "endDate": "2017-10-30", "gender": "", 
"ages": ["1", "11"], "keywordGroups": 
    [{"keywords": ["CharlieChoo"], "groupName": "CharlieChoo"}, 
    {"keywords": ["DeltaAir"], "groupName":"DeltaAir"}, 
    {"keywords": ["Alpha bet"], "groupName": "Alpha bet"}, 
{"keywords": ["ChooChoo"], "groupName": "ChooChoo"}, {"keywords":["Airline"], "groupName": "Airline"}], "device": "", "timeUnit": "date"}' 
+0

답변에 내 편집 내용을 볼 수 있습니까? 나는 약간의 실수를 가지고 있으며 당신이 한 번 보길 바란다. 응답에 다시 한 번 감사드립니다! – Kang

+0

또한 내 질문을 편집했습니다. @ Ajax1234 – Kang

+0

@kang'DNA'는 pandas 객체이므로'.index'를 지원하지 않습니다. 최근 편집에서 '본문'이 동일하게 유지 되었습니까? – Ajax1234

0

단순히 정규식을 사용합니다. DNA 목록에 대상 이름과 소스 이름이 포함 된 커플이 있다고 가정합니다.

import re 
length_of_DNA = len(DNA) 
for i, t in enumerate(DNA[:length_of_DNA/2]): 
    s = DNA[length_of_DNA/2+i] 
    body = re.sub(r'\"'+t+'\"', s, body, 2) 

도움이 되길 바랍니다.

0

"배치"교체를 수행 할 수 있도록 (당신은 요소의 수를 교체 계속해야 가정) 나는 다음을 수행합니다 :

lookup = {"Alpha": "CharlieChoo", 
      "Bravo": "DeltaAir", 
      "Charlie": "Alpha bet", 
      "Delta": "ChooChoo", 
      "Echo": "Airline"} 

lookup_count = {"Alpha": 2, 
       "Bravo": 2, 
       "Charlie": 2, 
       "Delta": 2, 
       "Echo": 2} 

def replace_using_lookups(match): 
    word = match.group(1) 
    if word in lookup and lookup_count[word] > 0: 
     lookup_count[word] -= 1 
     return '"{}"'.format(lookup[word]) 
    return '"{}"'.format(word) 


re.sub('"(\w+)"', replace_using_lookups, body) 

lookup_count DICT이 필요하지 않은 경우 당신이 할 수 더 간단한 람다를 사용하여 교체를 수행하십시오.