0

私はPythonを初めて使用するので、簡単な質問をお詫びします。私は確かに私を混乱させている何かを逃しています。

これは、ネスト、分割と関係があり、ループを推測していますが、うまくいきません。

これが私の元の文字列です:

name_scr = 'alvinone-90,80,70,50|simonthree-99,80,70,90|theotwo-90,90,90,65'

私はデータ構造を作成しようとしています-その中に名前とスコアを含むdict。

だからこれは私が始めたものです:

    test_scr = { } 
    new_name_scr = [list.split('-') for list in name_scr.split('|')]
# [['alvinone', '90,80,70,50'], ['simonthree', '99,80,70,90'], ['theotwo', '90,90,90,65']]

# this is not  right, and since the output is a list of lists, I cannot split it again 

これを3回目のコンマで分割するのに行き詰まります。だから私は次のことを試みます:

test_scores = {}
for student_string in name_scr.split('|'):
  for student in student_string.split('-'):
    for scores in student.split(','):
      test_scores[student] = [scores]

#but my result for test_scores (below) is wrong
#{'alvinone': ['alvinone'], '99,80,70,90': ['90'], 'theotwo': ['theotwo'], '90,80,70,50': ['50'], '90,90,90,65': ['65'], 'simonthree': ['simonthree']}

私はそれをこのように見せたい:

  {'alvinone': [99 80 70 50], 'simonthree': [90 80 70 90], 'theotwo': [90 90 90 65]} 

だから私がこれをするとき:

print test_scores['simonthree'][2] #it's 70

ここで私を助けてください。私はPythonを初めて使用するので、まだあまりよくわかりません。ありがとうございました。

4

7 に答える 7

2

分割は正しかったです。必要なのは、値を繰り返し処理してdictに変換することだけです。また、dictキーの要素に簡単にアクセスするには、値を文字列ではなくリストにする必要があります...

注:分割中は、変数名を「リスト」として使用しましたが、これはお勧めできません。

これをチェックして...

In [2]: str = 'alvinone-90,80,70,50|simonthree-99,80,70,90|theotwo-90,90,90,65'

In [3]: str_list = [l.split('-') for l in str.split('|')]

In [4]: str_list
Out[4]:
[['alvinone', '90,80,70,50'],
 ['simonthree', '99,80,70,90'],
 ['theotwo', '90,90,90,65']]

In [5]: elem_dict = {}

In [6]: for elem in str_list:
   ...:     elem_dict[elem[0]] = [x for x in elem[1].split(',')]
   ...:

In [7]: print elem_dict
{'simonthree': ['99', '80', '70', '90'], 'theotwo': ['90', '90', '90', '65'], 'alvinone': ['90
', '70', '50']}

In [8]: elem_dict['simonthree'][2]
Out[8]: '70'
于 2012-08-13T07:09:30.627 に答える
1
name_scr = 'alvinone-90,80,70,50|simonthree-99,80,70,90|theotwo-90,90,90,65'
test_scr = {}

for persinfo in name_scr.split('|'):
    name,scores = persinfo.split('-')
    test_scr[name] = map(int,scores.split(','))

print test_scr

name,scores = [elm0, elm1]リストを2つの変数にアンパックして、名前にリスト要素0が含まれ、スコアリスト要素1が含まれるようにします。

map(int,['0', '1', '2'])文字列のリストを整数のリストに変換します。

于 2012-08-13T07:13:08.787 に答える
1
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for i in s.split('|'):
...   k = i.split('-')
...   d[k[0]] = k[1].split(',')
... 
>>> d['simonthree']
['99', '80', '70', '90']

あなたがそれらを次のようにしたい場合int

>>> for i in s.split('|'):
...   k = i.split('-')
...   d[k[0]] = map(int,k[1].split(','))
... 
>>> d['simonthree']
[99, 80, 70, 90]
于 2012-08-13T07:15:24.380 に答える
1

dictは、2つのタプルのリストで初期化できます。

new_name_scr = [x.split('-') for x in name_scr.split('|')]
test_scores = dict((k, v.split(",")) for k, v in new_name_scr)

python2.7 +を使用する場合は、dict内包表記を使用することもできます。

test_scores = {k: v.split(",") for k, v in new_name_scr}
于 2012-08-13T07:16:18.190 に答える
0
str = 'alvinone-90,80,70,50|simonthree-99,80,70,90|theotwo-90,90,90,65'
a = dict((i.split("-")[0], [x for x in i.split("-")[1].split(',')])  for i in str.split("|"))
于 2012-08-13T07:21:31.483 に答える
0
>>> splitter = lambda ch: lambda s: s.split(ch)
>>> name_scr = 'alvinone-90,80,70,50|simonthree-99,80,70,90|theotwo-90,90,90,65'
>>> dict( (k,v.split(',')) for k,v in map(splitter('-'), name_scr.split('|')))

{'simonthree': ['99', '80', '70', '90'], 'theotwo': ['90', '90', '90', '65'], 'alvinone': ['90', '80', '70', '50']}
于 2012-08-13T07:17:39.640 に答える
0

これは、 PyYAMLの完璧なユースケースのように見えます。

import yaml

# first bring the string into shape
name_scr_yaml = (
    name_scr.replace("|","\n").replace("-",":\n  - ").replace(",","\n  - "))
print name_scr_yaml

# parse string:
print yaml.load(name_scr_yaml)

出力は次のとおりです。

alvinone:
  - 90
  - 80
  - 70
  - 50
simonthree:
  - 99
  - 80
  - 70
  - 90
theotwo:
  - 90
  - 90
  - 90
  - 65
{'simonthree': [99, 80, 70, 90], 'theotwo': [90, 90, 90, 65], 'alvinone': [90, 80, 70, 50]}
于 2012-08-13T07:25:35.657 に答える