python for문 질문드립니다.

magomzz의 이미지

어떤 포럼사이트에서 인용글 카테고리를 만드는 로직을 짜고 있는데요..
쉽게말해 A라는 글을 B와 C가 인용하면 A꾸러미하나 B라는 글을 D와E가 인용하면 B꾸러미하나 이런 로직인데..

예를 들어

art1 = ["A",'B','C','D','E','F']
quote = ["",'A','A','C','C','A']
g2 = pd.DataFrame({"Article":art1,"Quote":quote})

이런 g2라는 데이터 프레임에서 A의 글을 인용한 B,C,F를 묶고, C의 글을 인용한 D,F를 묶고 이런식인데
이것까지는 코드를 짰습니다.
dic = []
dic2 = []
for i in range(0,len(art1)) :
    dic.append(art1[i])
    dic2.append("")
    for j in range(1,len(quote)):
        if art1[i] == quote[j]:
            dic2.append(art1[j])
            dic.append("")
g3 = pd.DataFrame(OrderedDict({"Article":dic,"Quote":dic2}))

그런데 C가 A 카테고리에 들어가 있어서 C를 인용한 D,F도 A카테고리에 함께 넣을려고 하는데..
로직을 어떻게 짜야할지 모르겠어서 질문드립니다...!
감사합니다!
hwri09의 이미지

List comprehension을 사용하면 좀 더 python처럼 만들 수 있습니다.

dict = {}
for i in range(len(art1)):
    dict[art1[i]] = [art1[j] for j in range(len(quote)) if art1[i] == quote[j]]

두 번째 문제는 dict 사전의 key를 가지고 value를 검사하여 value에 key가 있으면 그 key에 해당하는 value를 뒤에 붙이면 될 것 같습니다. 그런데, 인용한 것이 없으면 value가 빈 list이므로, list 길이를 확인하여 처리해야 합니다.

dict_key = dict.keys()
for k in dict_key:
    for x in dict[k]:
        if len(dict[x]):
            dict[k] += dict[x]
print(dict)

magomzz의 이미지

그런데 A를 직접적으로 인용한F와 이중인용으로 들어온 D와E를 구분할 수 있는 방법이 있을까요?

hwri09의 이미지

원문과 인용이 1:1로 서로 연관 관계가 있어서 사전을 사용했는데, 깊이가 하나 더 늘어나면 사전의 값으로 사용했던 list를 다시 dictionary로 바꿔야 할 것 같습니다. 두 단계까지는 어찌 어찌 되는데, 인용 깊이가 더 깊어지면 근본적으로 구조 또는 접근 방법을 다시 생각해 봐야 할 것 같습니다.

먼저, art1, quote에서 원문을 key로 하고 인용한 문들을 list value로 했었는데, 이 value를 list가 아닌 사전(dictionary)으로 만듭니다.

dict = {}
for i in range(len(art1)):
    dict[art1[i]] = {art1[j]:[] for j in range(len(quote)) if art1[i] == quote[j]}

이렇게 하면 목록이 key이고 value에 인용 목록 list가 있던 것이 목록이 key이고 value에 다시 사전이 만들어지는데, 이 하부 사전의 key는 인용 목록이고 value는 빈 list 입니다. 이제 이 빈 list에 재 인용한 목록이 있으면, 이것을 찾아 넣어 줍니다.
for k in dict.keys():
    for x in dict[k].keys():
        if len(dict[x]):
            for y in dict[x].keys():
                dict[k][x].append(y)
 
print(dict)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.