【问题标题】:Trying to create new variables by strings from a list尝试通过列表中的字符串创建新变量
【发布时间】:2016-10-07 18:47:56
【问题描述】:

我一直在为此搜索互联网的尽头,并且我很清楚我正在尝试做的事情是多么沮丧。我只是想不出另一种方法来实现我想要的。 现在,对于我的实际问题,我得到了一个包含警察枪击信息的 csv。该文件包含案件的状态,旁边是城市。我想从记录在 csv 中的每个州的名称中提取一个变量,并将它们转换为列表,内容是该州的城市。我读过一些关于全局变量的东西,但我只是不知道从那里去哪里。我使用的语言是python。

编辑:根据要求,这是数据的格式和我当前的代码:

州|市

华盛顿|西雅图

加利福尼亚|洛杉矶

华盛顿|柯克兰

PVC = open("PoliceViolence_city.csv", "r", errors="ignore");
KBP = open("KilledByPolice.csv", "r", errors="ignore");

def start(dparse, dparse2):
    cur = [];
    cur2 = [];
    for aa in dparse:
        cur.append(aa);
    for ab in dparse2:
        cur2.append(ab);
    del cur2[0];
    del cur[0];
    for ba in range(len(cur)):
        cur[ba] = cur[ba].split(",");
    sortloc(cur);
    for bb in range(len(cur2)):
        cur2[bb] = cur2[bb].split(",");


def sortloc(dp):
    merge = [];
    state = [];
    city = [];
    s2 = [];
    for a in range(len(dp)):
        if dp[a][0] not in state:
            state.append(dp[a][0]);
        city.append(dp[a][1]);
        s2.append(dp[a][0]);
    for ba in range(len(city)):
        for bb in range(len(state)):
            if s2[ba] == state[bb]:
                print("Matched stuff!");



start(PVC, KBP);

理想情况下,我的输出将类似于:Washington = ["Seattle", "Kirkland"]。

提前感谢您的帮助!

【问题讨论】:

  • 如果您无法在代码中发布任何尝试,您能否准确说明所提供信息的结构以及您希望输出的理想状态?
  • 更好地使用字典data['State Name'] = [...] - 它更有用。

标签: python list csv variables


【解决方案1】:

使用csv.readercollections.defaultdict

import csv
import collections
with open('states.csv') as f:
    result = collections.defaultdict(list)
    reader = csv.reader(f)
    for state,city in reader:
        result[state].append(city)

文件:

CA,San Francisco
CA,Sacramento
CA,San Francisco
Idaho,Boise
New York,New York City

结果:

>>> import pprint
>>> pprint.pprint(result)
{'CA': ['San Francisco', 'Sacramento', 'San Francisco'],
 'Idaho': ['Boise'],
 'New York': ['New York City']}

【讨论】:

  • 嘿Tiger,我认为您可能是帮助我的最佳方法,我想与您分享一些屏幕截图。如果您愿意,请发送电子邮件至 thesilenceisfalling@gmail.com。谢谢!
  • SO 不适用于私人辅导服务(这对您来说是个好消息,因为我为此收取 40 美元/小时 :))。它旨在作为一个公共 QA 站点,人们可以在其中查找常见的编程挑战。如果您的问题不够具体,您可以编辑它(如您所愿)。如果您有一个完全不同的问题,那应该是一个新问题。记得在问之前尽你所能,并展示你的努力。
  • 哎呀,好的,很抱歉,这个网站还是新手,感谢您再次提供的帮助。 =3
【解决方案2】:

使用eval() 是可能的,但您应该真的不要这样做......完成任务的更结构化和安全的方法是获取州名并使其字典中的键:

txt = '''state1, city1
州2,城市2
州2,城市3
州3,城市4
州3,城市4'''

状态 = {}
对于 txt.split('\n') 中的行:
    州,城市 = line.split(', ')
    如果状态不在状态:
        states[state] = [] #创建一个空列表来保存一个州的所有城市
    if city not in states[state]: #不要把同一个城市放在两次
        states[state].append(city) #将城市插入列表


#结果结构:
#states = {
# 'state1': ['city1'],
# 'state2': ['city2', 'city3'],
# 'state3': ['city4']
#}

【讨论】:

  • 访问任何给定状态的语法是:states[state]。这也为您提供了一种简单的方法,通过调用 for state in states: 来遍历您拥有数据的所有州,然后每个“州”本身就是您拥有信息的所有城市的字典,并且几乎可以在同样的方式
  • @Davis 至于输出结构,我只是喜欢在将嵌套字典编写为 cmets 时以这种方式格式化嵌套字典,就像这里其他人建议的那样,它只是一个普通字典。
  • @Davis 使用字典或其他容器类型是*唯一真正的方法来做你所要求的。虽然可以使用eval() 创建全局变量,但坦率地说,它比字典方法要复杂得多。 (更不用说非常非常不安全)
  • @Davis 我简化了我的示例数据,希望它更像你在问题中描述的......
  • 嘿,@Aaron。我尝试将代码粘贴到我的 IDE 中以测试它是否会运行,但它没有。我得到了一个 ValueError,显然有太多的值需要解压。关于为什么的任何想法? (删除以前的 cmets,因为该视线在向我发出警告以供参考)
【解决方案3】:

是时候结束这件事了。我的朋友帮我介绍了字典。格式适合我的数据,并且我已将所有州作为其各自城市的父级。谢谢大家的帮助!虽然 furas 的回答对我的需要是正确的,但解释性不是很好,所以我认为总体上最有帮助的是 Aaron,因为他竭尽全力帮助我理解。希望你们都过得好!

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2020-04-21
    • 2018-08-21
    相关资源
    最近更新 更多