【问题标题】:Looping through a list of tuples to make a POST request with each tuple循环遍历元组列表以对每个元组发出 POST 请求
【发布时间】:2013-11-25 12:32:15
【问题描述】:

我这里有一个元组列表:

import datetime
import requests
from operator import itemgetter

original = [(datetime.datetime(2013, 11, 12, 19, 24, 50), u'78:E4:00:0C:50:DF', u' 8', u'Hon Hai Precision In', u''), (datetime.datetime(2013, 11, 12, 19, 24, 50), u'78:E4:00:0C:50:DF', u' 8', u'Hon Hai Precision In', u''), (datetime.datetime(2013, 11, 12, 19, 24, 48), u'9C:2A:70:69:81:42', u' 5', u'Hon Hai Precision In 12:', u''), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'00:1E:4C:03:C0:66', u' 9', u'Hon Hai Precision In', u''), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'20:C9:D0:C6:8F:15', u' 8', u'Apple', u''), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'68:5D:43:90:C8:0B', u' 11', u'Intel Orate', u' MADEGOODS'), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'68:96:7B:C1:76:90', u' 15', u'Apple', u''), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'68:96:7B:C1:76:90', u' 15', u'Apple', u''), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'04:F7:E4:A0:E1:F8', u' 32', u'Apple', u''), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'04:F7:E4:A0:E1:F8', u' 32', u'Apple', u'')]

data = [x[:-2] for x in original]

newData = sorted(data, key=itemgetter(0))

print newData

[(datetime.datetime(2013, 11, 12, 19, 24, 47), u'00:1E:4C:03:C0:66', u' 9'), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'20:C9:D0:C6:8F:15', u' 8'), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'68:5D:43:90:C8:0B', u' 11'), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'68:96:7B:C1:76:90', u' 15'), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'68:96:7B:C1:76:90', u' 15'), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'04:F7:E4:A0:E1:F8', u' 32'), (datetime.datetime(2013, 11, 12, 19, 24, 47), u'04:F7:E4:A0:E1:F8', u' 32'), (datetime.datetime(2013, 11, 12, 19, 24, 48), u'9C:2A:70:69:81:42', u' 5'), (datetime.datetime(2013, 11, 12, 19, 24, 50), u'78:E4:00:0C:50:DF', u' 8'), (datetime.datetime(2013, 11, 12, 19, 24, 50), u'78:E4:00:0C:50:DF', u' 8')]

每个元组中的第一个元素是日期/时间,第二个是 MAC 地址,第三个是 RSSI 强度。

我正在寻找将每个元组在 POST 请求中发送到 Google 测量协议的最佳方式,如下所示:

requests.post("http://www.google-analytics.com/collect", 
              data="v=1&tid=UA-22560594-2&cid="varMACADDRESS"&t=event&ec="varDATETIME"&ea="varRSSI")

“varXXXXXX”代表元组的元素。

这是我认为应该是解决方案,但我想不出如何将每个元组的元素分配给%s:

for tuples [:10] in newData:
    requests.post("http://www.google-analytics.com/collect", 
              data="v=1&tid=UA-22560594-2&cid="%s"&t=event&ec="%s"&ea="%s")

什么是最有效和最pythonic的方式来做到这一点?

【问题讨论】:

    标签: python list post google-analytics tuples


    【解决方案1】:

    您可以在遍历列表时解压元组值并使用format 插入值。

    for date, mac, rssi in newData:
        requests.post("http://www.google-analytics.com/collect", 
              data="v=1&tid=UA-22560594-2&cid={}&t=event&ec={}&ea={}".format(
                  mac, 
                  date, 
                  rssi)
        )
    

    【讨论】:

    • 这很好用,你介意解释一下 python 是如何知道日期 mac 和 rssi 是每个元组的 3 个元素吗?
    • Python 不知道这一点。这只是您自己选择给它们的名称,Python 为您在该迭代中所处的特定元组的元组中的每个元素进行位置解包,并为它们提供提供的名称。您也可以编写相同的 for 循环,例如 for tup in newData:,然后将 mac, date, rssi 作为 format 的参数,而不是 tup[1], tup[0], tup[2]
    • 如果你要添加一个额外的名字,比如for date, mac, rssi, something in newData:,Python 会抱怨没有足够的元素可以解压。
    【解决方案2】:

    只需利用您可以将dict 指定给data kwarg 和请求将handle the form-encoding for you 的事实。

    for date,mac,rssi in some_collection_of_tuples:
        payload = {'t':'event','v':'1','ec':date,'cid':mac,...} #etc
        requests.post("http://www.google-analytics.com/collect", data=payload)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      相关资源
      最近更新 更多