Python:字典和列表

时间:2016-03-16 12:29:09

标签: python dictionary

我想要一个没有值的26个字典的字典(每个字母一个),它将读取一个字符串并创建一个列表,该列表将包含字符串中字母的位置,并将其与键相关联。

示例:如果我有以下字符串AZERTYUIOPAAAZ,则字典中的键A必须将列表[0,10,11,12]作为值,因为我们找到了字母A在字符串中的这些位置。我设法让我的字典为每个字母占一个位置,但我不能创建一个包含所有位置的列表。

这是我的代码:

string1 = "SQUALALANOUSSOMESPARTISETJETEDTESTE"
taille = len(string1)
dictio = dict()
dictio = {'A':None,'B':None,'C':None,'D':None,'E':None,'F':None,'G':None,'H':None,'I':None,'J':None,'K':None,'L':None,'M':None,'N':None,'O':None,'P':None,'Q':None,'R':None,'S':None,'T':None,'U':None,'V':None,'W':None,'X':None,'Y':None,'Z':None}
a = 0
for a in range(taille):
    dictio[string1[a]] = a
    print(dictio)

5 个答案:

答案 0 :(得分:2)

问题是你的任务说明:

//setting.jsx 'use babel'; import React from 'react'; import ReactDOM from 'react-dom'; import TextField from 'material-ui/lib/text-field'; import RaisedButton from 'material-ui/lib/raised-button'; var Settings = React.createClass({ render(){ return ( <form> <TextField hintText="username" floatingLabelText="please enter username" type="text" /> <TextField hintText="password" floatingLabelText="please enter password" type="text" /> <RaisedButton type="submit" label="login" className="button-submit" primary={true} /> </form> ); } }); export default Settings; //TabNav.jsx 'use babel'; import fs from 'fs'; import React from 'react'; import ReactDOM from 'react-dom'; import Tabs from 'material-ui/lib/tabs/tabs'; import Tab from 'material-ui/lib/tabs/tab'; import FontIcon from 'material-ui/lib/font-icon'; import Settings from '../views/Settings.jsx'; import Timetable from '../views/Timetable.jsx'; import Notes from '../views/Notes.jsx'; class TabNav extends React.Component { constructor(props) { super(props); this.state = { value: 'timetable' }; this.CourseJsonData = JSON.parse(fs.readFileSync('data/courses.json', 'utf8')); } handleChange = (value) => { this.setState({ value: value }); }; render() { return ( <Tabs value={this.state.value} onChange={this.handleChange}> <Tab value="timetable" icon={<FontIcon className="material-icons">view_list</FontIcon>}> <Timetable data={this.CourseJsonData}/> </Tab> <Tab value="notes" icon={<FontIcon className="material-icons">assignment_turned_in</FontIcon>}> <Notes/> </Tab> <Tab value="settings" icon={<FontIcon className="material-icons">settings</FontIcon>}> <Settings/> </Tab> </Tabs> ); } } export default TabNav;

您正在为地图中的特定值分配整数dictio[string1[a]] = a。如果要将它们全部存储起来,则需要使用列表。如下所示:

a

答案 1 :(得分:2)

您可以使用A 1011 1012 1061 11001 873824 2240 11002 36792 557172 11003 2970 隐式地使用空列表初始化键。之后枚举字符并将其索引附加到正确的桶中。

defaultdict

答案 2 :(得分:2)

不是一个漂亮的解决方案,但它是您的计划的设计方式:制作dictio = {'A':[],'B':[],'C':[],'D':[],......并在循环中dictio[string1[a]].append(a)

答案 3 :(得分:1)

有几种方法:

固定的字典集

string1 = "SQUALALANOUSSOMESPARTISETJETEDTESTE"
dictio = {'A':[],'B':[],'C':[],'D':[],'E':[],'F':[],'G':[],'H':[],'I':[],'J':[],'K':[],'L':[],'M':[],'N':[],'O':[],'P':[],'Q':[],'R':[],'S':[],'T':[],'U':[],'V':[],'W':[],'X':[],'Y':[],'Z':[]}

i = 0
for char in string1:
    dictio[char].append(i)
    i += 1

# {'L': [4, 6], 'A': [3, 5, 7, 18], 'Z': [], 'N': [8], 'J': [25], 'B': [], 'M': [14], 'C': [], 'S': [0, 11, 12, 16, 22, 32], 'K': [], 'W': [], 'Q': [1], 'O': [9, 13], 'R': [19], 'E': [15, 23, 26, 28, 31, 34], 'D': [29], 'P': [17], 'X': [], 'G': [], 'I': [21], 'H': [], 'Y': [], 'U': [2, 10], 'F': [], 'V': [], 'T': [20, 24, 27, 30, 33]}

变量字典

string1 = "SQUALALANOUSSOMESPARTISETJETEDTESTE"
dictio = {}

i = 0
for char in string1:
    if char not in dictio:
        dictio[char] = []
    dictio[char].append(i)
    i += 1

第二个版本会给出一个只有字母的字典。

答案 4 :(得分:0)

正如L-Jones所解释的那样,您的原始系统失败了,因为您在每个点都设置了字典的值。要解释一下,如果您执行以下操作:

a = 1
a = 2

a的值为2,没有1值的记录。这实际上与替换给定键的字典值相同。

如果您将字典的默认值初始化为空列表[],而不是None,则可以使用append在必要时添加索引。请参阅以下内容:

import string
string1 = "SQUALALANOUSSOMESPARTISETJETEDTESTE"
taille = len(string1)
dictio = dict()
dictio = {letter: [] for letter in string.ascii_uppercase}
# The above is a shorter alternative to typing out all of the letter-empty list pairs by hand
# a = 0 is unnecessary because a will be initialized to 0 with the range
for a in range(taille):
    dictio[string1[a]].append(a)
print(dictio)

请注意,字典不会被排序为A-Z,原因我并不完全确定,但它会包含您需要的所有内容。

如果您不关心没有索引的字母,请参阅Nander Speerstra在其答案中提出的解决方案:变量字典,其中不包含不在其中的密钥串。它会以一点时间开销为代价来降低内存成本,无论如何这可能都不会很大。如果你真的想要压缩声明:

import string
string1 = "SQUALALANOUSSOMESPARTISETJETEDTESTE"
taille = len(string1)
dictio = dict()
dictio = {letter: [] for letter in string.ascii_uppercase}
for index, letter in zip(range(taille), string1):
    dictio[letter].append(index)
print(dictio)

也可以与变量dict系统结合使用。