1

私は AC コーダーですが、Python は異なります。これに関する問題に遭遇しました

items = [
     ["/ank/homepage.py","Home"],
     ["/ank/package.py","Packages"],
     ["/status.py","Status"],
     ["/task.py","Task"],
     ["/report.py","Report"]
]

static_html='<table id="main_nav" align="center"><tr>'

for each_item in items:
    if each_item in items:
        if isinstance(each_item, list):
            static_html=  static_html + '<td><a href=" ', each_item[0], ' "> ', each_item[1], ' </a></th> '

static_html+='</tr></table>'

print static_html

次に、IDE からエラー /usr/bin/python2.7 が送信されます

/home/tsuibin/code/aps/dxx/test_tmp.py
Traceback (most recent call last):
  File "/home/tsuibin/code/aps/dxx/test_tmp.py", line 39, in <module>
    printMainNavigation()
  File "/home/tsuibin/code/aps/dxx/test_tmp.py", line 20, in printMainNavigation
    static_html=  static_html + '<td><a href=" ', each_item[0], ' "> ', each_item[1], ' </a></th> '
TypeError: can only concatenate tuple (not "str") to tuple
Process finished with exit code 1
4

2 に答える 2

5

文字列連結にコンマを入れています:

static_html=  static_html + '<td><a href=" ', each_item[0], ' "> ', each_item[1], ' </a></th> '

したがって、Python はこれらの要素をタプル ( str0 + (str1, str2, str3)) として認識します。+代わりに使用してください:

static_html=  static_html + '<td><a href=" ' + each_item[0] + ' "> ' + each_item[1] + ' </a></th> '

さらに良いことに、文字列の書式設定を使用します。

static_html += '<td><a href="{0[0]}"> {0[1]} </a></th> '.format(each_item)

Python で一連の文字列を連結する場合、実際には alist()を仲介として使用する方が高速になります。リストを作成''.join()し、出力を取得するために使用します。

static_html = ['<table id="main_nav" align="center"><tr>']
for each_item in items:
     static_html.append('<td><a href="{0[0]}"> {0[1]} </a></th> '.format(each_item))

static_html.append('</tr></table>')
static_html = ''.join(static_html)

まったくテストする必要がないことに注意してくださいeach_item in items。すでにループ内のリストから項目を取得しているだけです。それは、何の役にも立たない余分な作業です。

于 2013-01-04T07:25:37.660 に答える
4

他の人があなたのエラー メッセージの原因を指摘しています。私は自由にコードを少し書き直しました。私が行った主なことは、文字列の連結を避けることです。Python では、文字列は不変であるため、連結には新しい文字列全体を作成する必要があります。これを回避する一般的な方法は、文字列のフラグメントをリストに入れ、文字列のjoin()メソッドを使用してリストのすべての要素を結合することです。

もう 1 つの大きな変更点は、string.format()メソッドを使用してフラグメントを作成することです。

items = [
     ["/ank/homepage.py","Home"],
     ["/ank/package.py","Packages"],
     ["/status.py","Status"],
     ["/task.py","Task"],
     ["/report.py","Report"]
]

# Start a list of fragments with the start of the table.
html_fragments = [
    '<table id="main_nav" align="center"><tr>'
]

for item in items:
    # No need for the 'if item in items' here - we are iterating
    # over the list, so we know its in the list.
    #
    # Also, this ifinstance() test is only required if you cannot
    # guarantee the format of the input. I have changed it to allow
    # tuples as well as lists.
    if isinstance(item, (list, tuple)):
        # Use string formatting to create the row, and add it to
        # the list of fragments.
        html_fragments.append('<td><a href="{0:s}">{1:s}</a></td>'.format(*item))

# Finish the table.
html_fragments.append ('</tr></table>')

# Join the fragments to create the final string. Each fragment
# will be separated by a newline in this case. If you wanted it
# all on one line, change it to ''.join(html_fragments).
print '\n'.join(html_fragments)

そして、私が得た出力:

<table id="main_nav" align="center"><tr>
<td><a href="/ank/homepage.py">Home</a></td>
<td><a href="/ank/package.py">Packages</a></td>
<td><a href="/status.py">Status</a></td>
<td><a href="/task.py">Task</a></td>
<td><a href="/report.py">Report</a></td>
</tr></table>
于 2013-01-04T07:27:30.277 に答える